﻿/* @@ Request Property Info
==================================================================== */

function Setup_RequestPropertyInfo(cid_control, url_dataTarget, requestTimeout, languageID, fromName, fromAddress, toName, toAddress, messageSubject, resourcesJSON, defaultText, propertyID,userInfoJSON) {

    var $control = $('#' + cid_control);
    
    var $contactForm = {
        name: $('#txtName', $control),
        email: $('#txtEmail', $control),
        phone: $('#txtPhone', $control),
        questions: $('#txtQuestions', $control),
        send: $('#btnSend', $control)
    };

    var $feedbacks = {
        success: $('.successSending', $control),
        error: $('.errorSending', $control),
        loading: $('.loading', $control),
        requiredFields: $('.requiredFields', $control),
        invalidEmail: $('.invalidEmail', $control),
        invalidPhone: $('.invalidPhone', $control)
    };
    
    
    var $settings = {
        url_dataTarget: url_dataTarget,
        requestTimeout: requestTimeout,
        languageID: languageID,
        fromName: fromName,
        fromAddress: fromAddress,
        toName: toName,
        toAddress: toAddress,
        userName: '',
        userEmail: '',
        userPhone: '',
        messageBody: '',
        messageSubject: '',
        resources: jQuery.parseJSON(resourcesJSON),
        propertyID: propertyID,
        userInfo:$.parseJSON(userInfoJSON)
    };
    
    function INIT(){
        $contactForm.name.val($settings.userInfo.Name);
        $contactForm.email.val($settings.userInfo.Email);
        $contactForm.phone.val($settings.userInfo.Phone);
        $contactForm.questions.text(defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
    }
    INIT();

    $contactForm.send.click(function () {

        $feedbacks.requiredFields.hide();
        $feedbacks.invalidEmail.hide();
        $feedbacks.invalidPhone.hide();
        $feedbacks.error.hide();

        if (IsFormValid()) {
            LockContactForm();
            $feedbacks.loading.show();

            // - chamar o handler que envia o e-mail
            if ($settings.url_dataTarget != '') {
                $.ajax({
                    type: 'POST',
                    dataType: 'json',
                    processData: true,
                    timeout: $settings.requestTimeout,
                    url: $settings.url_dataTarget,
                    data: {
                        userName: $contactForm.name.val(),
                        userEmail: $contactForm.email.val(),
                        userPhone: $contactForm.phone.val(),
                        questions: $contactForm.questions.val(),
                        propertyID: $settings.propertyID
                    },
                    error: function (request, status, error) {
                        $feedbacks.loading.hide();
                        $feedbacks.error.show();
                        UnlockContactForm();
                    },
                    success: function (data) {
                        $feedbacks.loading.hide();
                        if (data.success == "1") {
                            $feedbacks.success.show();
                            UnlockContactForm();
                            INIT();
                        }
                        else {
                            $feedbacks.error.show();
                            UnlockContactForm();
                        }
                    }
                });
            }
            else {
                alert('DataSource URL not defined!');
            }

        }

        return false;
    });
    

    function IsFormValid() {
        // - required fields
        if ($contactForm.name.val() == '' || $contactForm.phone.val() == '' || $contactForm.email.val() == '' || $contactForm.questions.val() == '') {
            $feedbacks.requiredFields.show();
            return false;
        }
        // - valid email 
        if (!IsValidEmail($contactForm.email.val())) {
            $feedbacks.invalidEmail.show();
            return false;
        }
        
        // - valid phone
        if (!IsValidPhone($contactForm.phone.val())) {
            $feedbacks.invalidPhone.show();
            return false;
        } 
        
        return true;
    };    

    function LockContactForm() {
        $contactForm.name.hide();
        $contactForm.email.hide();
        $contactForm.phone.hide();
        $contactForm.questions.hide();
        $contactForm.send.hide();
    };

    function UnlockContactForm() {
        $contactForm.name.show();
        $contactForm.email.show();
        $contactForm.phone.show();
        $contactForm.questions.show();
        $contactForm.send.show();
    };

    function Hide_Feedbacks() {      
        $feedbacks.success.hide();
        $feedbacks.error.hide();
        $feedbacks.loading.hide();
        $feedbacks.requiredFields.hide();
        $feedbacks.invalidEmail.hide();
        $feedbacks.invalidPhone.hide();
    };

    function Init() {
        Hide_Feedbacks();
        UnlockContactForm();

        $contactForm.questions.text(defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
       
    };
    Init();

};


/* @@ Request Agency Info
==================================================================== */

function Setup_RequestAgencyInfo(cid_control, url_dataTarget, requestTimeout, languageID, defaultText, agencyID,userInfoJSON) {
    var $control = $('#' + cid_control);

    var $contactForm = {
        name: $('#txtName', $control),
        email: $('#txtEmail', $control),
        phone: $('#txtPhone', $control),
        questions: $('#txtQuestions', $control),
        send: $('#btnSend', $control)
    };

    var $feedbacks = {
        success: $('.successSending', $control),
        error: $('.errorSending', $control),
        loading: $('.loading', $control),
        requiredFields: $('.requiredFields', $control),
        invalidEmail: $('.invalidEmail', $control),
        invalidPhone:$('.invalidPhone',$control)
    };

    var $settings = {
        url_dataTarget: url_dataTarget,
        requestTimeout: requestTimeout,
        languageID: languageID,
        userInfo: $.parseJSON(userInfoJSON)
    };

    function INIT() {
        $contactForm.name.val($settings.userInfo.Name);
        $contactForm.email.val($settings.userInfo.Email);
        $contactForm.phone.val($settings.userInfo.Phone);
        $contactForm.questions.text(defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
        
    }
    INIT();
    
    
    $contactForm.send.click(function() {

        $feedbacks.requiredFields.hide();
        $feedbacks.invalidEmail.hide();
        $feedbacks.invalidPhone.hide();

        if (IsFormValid()) {
            LockContactForm();
            $feedbacks.loading.show();

            // - chamar o handler que envia o e-mail
            if ($settings.url_dataTarget != '') {
                $.ajax({
                    type: 'POST',
                    dataType: 'json',
                    processData: true,
                    timeout: $settings.requestTimeout,
                    url: $settings.url_dataTarget,
                    data: {
                        userName: $contactForm.name.val(),
                        userEmail: $contactForm.email.val(),
                        userPhone: $contactForm.phone.val(),
                        questions: $contactForm.questions.val(),
                        agencyID: agencyID
                    },
                    error: function(request, status, error) {
                        $feedbacks.loading.hide();
                        $feedbacks.error.show();
                        UnlockContactForm();
                    },
                    success: function(data) {
                        $feedbacks.loading.hide();
                        if (data.success == "1") {
                            $feedbacks.success.show();
                            UnlockContactForm();
                            INIT();
                        }
                        else {
                            $feedbacks.error.show();
                            UnlockContactForm();
                        }
                    }
                });
            }
            else {
                alert('DataSource URL not defined!');
            }

        }

        return false;
    });


    function IsFormValid() {
        // - required fields
        if ($contactForm.name.val() == '' || $contactForm.phone.val() == '' || $contactForm.email.val() == '' || $contactForm.questions.val() == '') {
            $feedbacks.requiredFields.show();
            return false;
        }
        // - valid email 
        if (!IsValidEmail($contactForm.email.val())) {
            $feedbacks.invalidEmail.show();
            return false;
        }

        // - valid phone 
        if (!IsValidPhone($contactForm.phone.val())) {
            $feedbacks.invalidPhone.show();
            return false;
        }
        return true;
    };

    function LockContactForm() {
        $contactForm.name.hide();
        $contactForm.email.hide();
        $contactForm.phone.hide();
        $contactForm.questions.hide();
        $contactForm.send.hide();
    };

    function UnlockContactForm() {
        $contactForm.name.show();
        $contactForm.email.show();
        $contactForm.phone.show();
        $contactForm.questions.show();
        $contactForm.send.show();
    };

    function Hide_Feedbacks() {
        $feedbacks.success.hide();
        $feedbacks.error.hide();
        $feedbacks.loading.hide();
        $feedbacks.requiredFields.hide();
        $feedbacks.invalidEmail.hide();
        $feedbacks.invalidPhone.hide();
    };

    function Init() {
        Hide_Feedbacks();
        UnlockContactForm();

        $contactForm.questions.text(defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));

    };
    Init();

};




/* @@ Schedule Visit
   ==================================================================== */

function Setup_VisitSchedulerForm(cid_control, url_dataTarget, requestTimeout, languageID, fromName, fromAddress, toName, toAddress, messageSubject, resourcesJSON, propertyID,userInfoJSON){

	var $control = $('#' + cid_control);
	var $control_views = {
		calendar: $('#formCalendar', $control),
		contacts: $('#formContacts', $control)
	};
	
	var $contactForm = {
		name:  $('#txtSchedulerName', $control_views.contacts),
		email:  $('#txtSchedulerEmail', $control_views.contacts),
		phone:  $('#txtSchedulerPhone', $control_views.contacts)
	};
	
	var $picker_nodes = {
		days: $('.day span', $control),
		periods: $('.period span', $control)
	};
	
	var $resumes = {
		days: $('.resume .days', $control),
		periods: $('.resume .periods', $control)
	};
	
	var $buttons = {
		schedule : $('#btnSchedule', $control),
		sendSchedule : $('#btnSendSchedule', $control),
		cancel: $('#btnCancel', $control)
	};                   
	
	var $validationFeedback = {
		pickYourSchedule: $('.validationFeedback .pickYourSchedule', $control),
		requiredFields: $('.validationFeedback .requiredFields', $control),
		invalidEmail: $('.validationFeedback .invalidEmail', $control),
		invalidPhone: $('.validationFeedback .invalidPhone', $control),
		success: $('.successSending', $control),
        error: $('.errorSending', $control),
        loader: $('.loading', $control)
	};
	
	var resources = jQuery.parseJSON(resourcesJSON);
	var $settings = {
		nDays: $picker_nodes.days.size(),
		nPeriods: $picker_nodes.periods.size(),
		labels: {
			allDays: resources.AllDays,
			allPeriods: resources.AllPeriods,
			weekEnd: resources.WeekEnd,
			duringWeek: resources.DuringWeek
		},
		resume_lastConnector: ' e',
		url_dataTarget: url_dataTarget,
		requestTimeout: requestTimeout,
		languageID: languageID,
		fromName: fromName,
		fromAddress: fromAddress,
		toName: toName,
		toAddress: toAddress,
        userName: '',
        userEmail: '',
        userPhone: '',
        messageBody: '',
        messageSubject: messageSubject,
        propertyID: propertyID,
        userInfo: $.parseJSON(userInfoJSON)
    };

    function INIT() {
        $contactForm.name.val($settings.userInfo.Name);
        $contactForm.email.val($settings.userInfo.Email);
        $contactForm.phone.val($settings.userInfo.Phone);
        
    }
    INIT();
	
		
	
	// criar biblioteca de dias
	var daysLibrary = new Array($settings.nDays);
	if (daysLibrary.length) {
		// para cada dia
		$picker_nodes.days.each(function(index){
			// criar um objecto com a informação do mesmo
			daysLibrary[index] = {
				name: $(this).text(),
				selected: false
				};
			// atribuir um identificador ao span				
			$(this).data('dayIndex', index);
			// aplicar o diminutivo do dia
			$(this).text($(this).text().substr(0,3));
		});
	}
	
	// criar biblioteca de periodos
	var periodsLibrary = new Array($settings.nPeriods);
	if (periodsLibrary.length) {
		// para cada dia
		$picker_nodes.periods.each(function(index){
			// criar um objecto com a informação do mesmo
			periodsLibrary[index] = {
				name: $(this).text(),
				selected: false
				};
			// atribuir um identificador ao span				
			$(this).data('periodIndex', index);
		});
	}
	
	function Setup_PickerInteraction(){
	
		function DaysPicker(){
			$picker_nodes.days.click(function(){
				// obtenho o indice do dia pickado
				var dayIndex = $(this).data('dayIndex');
				// tou a deseleccionar
				if ($(this).hasClass('current')) {
					$(this).removeClass('current');
					daysLibrary[dayIndex].selected = false;
				}
				// tou a seleccionar
				else {
					$(this).addClass('current');
					daysLibrary[dayIndex].selected = true;
				}
				Setup_Resume();
				Reset_ValidationFeedbacks();
			});
		};
		DaysPicker();
		
		function PeriodsPicker(){
			$picker_nodes.periods.click(function(){
				// obtenho o indice do dia pickado
				var periodIndex = $(this).data('periodIndex');
				// tou a deseleccionar
				if ($(this).hasClass('current')) {
					$(this).removeClass('current');
					periodsLibrary[periodIndex].selected = false;
				}
				// tou a seleccionar
				else {
					$(this).addClass('current');
					periodsLibrary[periodIndex].selected = true;
				}
				Setup_Resume();
				Reset_ValidationFeedbacks();
			});
		};
		PeriodsPicker();
		
	};
	Setup_PickerInteraction();
	
	function Setup_Resume() {
		
		function DaysResume() {
			
			var myDaysResume = '';
			var selectedDaysCounter = 0;
			var monday = false,
			    tuesday = false,
			    wednesday = false,
			    thursday = false,
			    friday = false,
			    saturday = false,
			    sunday = false;
			    
			var otherDay = false;
			
			// acrescento à string cada dia seleccionado
			$.each(daysLibrary, function(index, dayInfo){
				if (dayInfo.selected) {
					// tratamento da virgula
					if (myDaysResume.length > 0)
						myDaysResume += ', ' + dayInfo.name;
					else
						myDaysResume += dayInfo.name;
					// incremento ao contador de dias seleccionados
		            selectedDaysCounter++;

		            // marco os dias
		            if (index == 0) monday = true;
		            if (index == 1) tuesday = true;
		            if (index == 2) wednesday = true;
		            if (index == 3) thursday = true;
		            if (index == 4) friday = true;
					if (index == 5) saturday = true;
					if (index == 6) sunday = true;
					
					// marco outro dia 
					if (otherDay != true && (index != 5 && index != 6)) otherDay = true; 
				}			
			});
			
			// se todos os dias seleccionados
			if (selectedDaysCounter == $settings.nDays) {
				myDaysResume = $settings.labels.allDays;
			};
			
			// se fim de semana
			if (saturday && sunday && !otherDay) {
				myDaysResume = $settings.labels.weekEnd
			}

			if (monday && tuesday && wednesday && thursday && friday && !saturday && !sunday) { 
			    myDaysResume = $settings.labels.duringWeek
			}
			
			//myDaysResume = Setup_ResumeString(myDaysResume, $settings.resume_lastConnector);
			
			$resumes.days.text(myDaysResume);
			
		};
		DaysResume();
		
		function PeriodsResume() {
			
			var myPeriodsResume = '';
			var selectedPeriodsCounter = 0;
			
			// acrescento à string cada periodo seleccionado
			$.each(periodsLibrary, function(index, periodInfo){
				if (periodInfo.selected) {
					// tratamento da virgula
					if (myPeriodsResume.length > 0)
						myPeriodsResume += ', ' + periodInfo.name;
					else
						myPeriodsResume += periodInfo.name;
					// incremento ao contador de dias seleccionados
					selectedPeriodsCounter++;
				}			
			});
			
			// se todos os dias seleccionados
			if (selectedPeriodsCounter == $settings.nPeriods) {
				myPeriodsResume = $settings.labels.allPeriods;
			};
			
			//myPeriodsResume = Setup_ResumeString(myPeriodsResume, $settings.resume_lastConnector);
						
			$resumes.periods.text(myPeriodsResume);
			
		};
		PeriodsResume();
		
		function Setup_ResumeString(str,charToReplace){
			// not working
			return str.replaceAt(str.lastIndexOf(","),charToReplace);
		}
		
	};
	
	
	function Setup_Navigation() {
	
		$buttons.schedule.click(function(){

			// form valido, passamos para o próximo passo
			if ($resumes.days.text() != '' || $resumes.periods.text() != '') {
				$control_views.calendar.fadeOut(function(){
					$control_views.contacts.fadeIn();
					$contactForm.name.focus();
				});
			}
			// form invalido, mostro o feedback
			else {
				$validationFeedback.pickYourSchedule.show();
			}
			
			return false;
		});

		$buttons.sendSchedule.click(function () {
		    Reset_ValidationFeedbacks();

		    if (IsFormValid()) {
		        LockContactForm();
		        $validationFeedback.loader.show();
		        // - chamar o handler que envia o e-mail

		        var _userSchedule = $resumes.days.first().text();
		        if ($resumes.periods.first().text() != "") {
		            _userSchedule += '(' + $resumes.periods.first().text() + ')';
		        }
		        if ($settings.url_dataTarget != '') {
		            $.ajax({
		                type: 'POST',
		                dataType: 'json',
		                processData: true,
		                timeout: $settings.requestTimeout,
		                url: $settings.url_dataTarget,
		                data: {
		                    userName: $contactForm.name.val(),
		                    userEmail: $contactForm.email.val(),
		                    userPhone: $contactForm.phone.val(),
		                    userSchedule: _userSchedule,
		                    propertyID: $settings.propertyID
		                },
		                error: function (request, status, error) {
		                    $validationFeedback.loader.hide();
		                    $validationFeedback.error.show();
		                    UnlockContactForm();
		                },
		                success: function (data) {
		                    $validationFeedback.loader.hide();
		                    if (data.success == "1") {
		                        $validationFeedback.success.show();
		                        UnlockContactForm();
                                Reset_Form();
		                        INIT();
		                    }
		                    else {
		                        $validationFeedback.error.show();
		                        UnlockContactForm();
		                    }
		                }
		            });
		        }
		        else {
		            alert('DataSource URL not defined!');
		        }

		    }

		    return false;
		});
		
		$buttons.cancel.click(function(){
			//Reset_Form();
			$control_views.contacts.fadeOut(function(){
			    $control_views.calendar.fadeIn();
			});
			return false;
		});
		
		function IsFormValid() { 
		    
		    if ($contactForm.name.val() == '' || $contactForm.email.val() == '' || $contactForm.phone.val() == '') {
		        $validationFeedback.requiredFields.show();
		        return false;
		    }
		    
		    if (!IsValidEmail($contactForm.email.val())) { 
			    $validationFeedback.invalidEmail.show();
			    return false;
			}
			
		    if (!IsValidPhone($contactForm.phone.val())) { 
		        $validationFeedback.invalidPhone.show();
		        return false;
		    } 
		    		    
		    return true;

		}
		
	};
	Setup_Navigation();
	
	function Reset_ValidationFeedbacks() {
		$validationFeedback.pickYourSchedule.hide();
		$validationFeedback.requiredFields.hide();
		$validationFeedback.invalidEmail.hide();
		$validationFeedback.invalidPhone.hide();
		$validationFeedback.loader.hide();
		$validationFeedback.success.hide();
		$validationFeedback.error.hide();
	};
	
	function LockContactForm() { 
        $contactForm.name.hide();
        $contactForm.email.hide();
        $contactForm.phone.hide();
        $buttons.sendSchedule.hide();
        $buttons.cancel.hide();
    };
    
    function UnlockContactForm() { 
        $contactForm.name.show();
        $contactForm.email.show();
        $contactForm.phone.show();
        $buttons.sendSchedule.show();
        $buttons.cancel.show();
    };
	
	function Reset_Form(){
		
		// reset aos estados da libraria de periodos
		$.each(periodsLibrary, function(index, periodInfo){
		    periodInfo.selected = false;	
		});
		$picker_nodes.periods.removeClass('current');
		
		// reset aos estados da libraria de dias
		$.each(daysLibrary, function(index, daysInfo){
		    daysInfo.selected = false;	
		});
		$picker_nodes.days.removeClass('current');
		
		// reset aos resumes
		$resumes.days.text('');
		$resumes.periods.text('');
		
		// reset ao form
		$contactForm.name.val('');
		$contactForm.email.val('');
		$contactForm.phone.val('');
		
	};
	
	
	function Init(){
		$control_views.calendar.show();
		$control_views.contacts.hide();
		$control.show();
		Reset_ValidationFeedbacks();
	}; 
	Init();
	

};


   
   

/* @@ Contact Agencies
   ==================================================================== */

function Setup_ContactAgencies(cid_control, url_dataTarget, requestTimeout, languageID, defaultText, datasource,userInfoJSON) {
         
     var $control = $('#' + cid_control);
     $control.BuildContactAgencies({
        cid_control: cid_control,
        url_dataTarget: url_dataTarget,
        languageID: languageID,
        requestTimeout: Number(requestTimeout),
        defaultText: defaultText,
        datasource: jQuery.parseJSON(datasource),
        userInfo:jQuery.parseJSON(userInfoJSON)
    });
};


(function($) {
    $.fn.BuildContactAgencies = function(pluginSettings) {

        var defaultSettings = {
            cid_control: '',
            url_dataTarget: '',
            requestTimeout: 5000,
            languageID: 'pt-PT',
            maxVisibleAgencies: 0,
            datasource: '',
            userInfo: ''
        };
        var $settings = $.extend(defaultSettings, pluginSettings);

        return this.each(function() {

            // @ Declarations ............................................................................
            // ......................................................................................

            var $stage = {
                agenciesList: $('#dAgenciesList', $(this)),
                contactForm: $('#dAgenciesContactForm', $(this))
            };

            var $contactForm = {
                name: $('#txtName', $stage.contactForm),
                email: $('#txtEmail', $stage.contactForm),
                phone: $('#txtPhone', $stage.contactForm),
                questions: $('#txtQuestions', $stage.contactForm),
                send: $('#btnSend', $stage.contactForm)
            };

            var $links = {
                expand: $('#lnkExpand', $stage.agenciesList),
                collapse: $('#lnkCollapse', $stage.agenciesList)
            };

            var $feedbacks = {
                success: $('.successSending', $stage.contactForm),
                error: $('.errorSending', $stage.contactForm),
                loading: $('.loading', $stage.contactForm),
                requiredFields: $('.requiredFields', $stage.contactForm),
                invalidEmail: $('.invalidEmail', $stage.contactForm),
                invalidPhone: $('.invalidPhone', $stage.contactForm),
                progressBar: $('.progressBar', $stage.agenciesList),
                generalError: $('.containerErrors_icn', $(this)),
                generalErrorMsg: $('.containerErrors_msg', $stage.agenciesList)
            };

            // @ Init ............................................................................
            // ......................................................................................

            $feedbacks.success.hide();
            $feedbacks.error.hide();
            $feedbacks.loading.hide();
            $feedbacks.requiredFields.hide();
            $feedbacks.invalidEmail.hide();
            $feedbacks.invalidPhone.hide();
            $feedbacks.progressBar.hide();
            $feedbacks.generalError.hide();
            $feedbacks.generalErrorMsg.hide();

            //PrintSettings();                        
            ReadyForm();
            RequestAndTriggerBindings();


            // @ Methods ............................................................................
            // ......................................................................................


            function INIT() {
                $contactForm.name.val($settings.userInfo.Name);
                $contactForm.email.val($settings.userInfo.Email);
                $contactForm.phone.val($settings.userInfo.Phone);
                $contactForm.questions.text($settings.defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
            }
            INIT();

            function PrintSettings() {
                console.log('cid_control: ' + $settings.cid_control);
                console.log('url_dataTarget: ' + $settings.url_dataTarget);
                console.log('requestTimeout: ' + $settings.requestTimeout);
                console.log('languageID: ' + $settings.languageID);
                console.log('defaultText: ' + $settings.defaultText);
            };

            function ReadyForm(defaultText) {
                if (GetSelectedAgencies() !== undefined) {
                    UnlockContactForm();
                }
                else {
                    LockContactForm();
                    $links.expand.hide();
                    $links.collapse.hide();
                }
            };

            function LockContactForm() {
                $contactForm.name.hide();
                $contactForm.email.hide();
                $contactForm.phone.hide();
                $contactForm.questions.hide();
                $contactForm.send.hide();
            };

            function UnlockContactForm() {
                $contactForm.name.show();
                $contactForm.email.show();
                $contactForm.phone.show();
                $contactForm.questions.show();
                $contactForm.send.show();
            };

            function GetSelectedAgencies() {

                var selectedAgencies;

                // obtenho todas as checkboxs seleccionadas
                var $selectedCheckboxs = $('input', $stage.agenciesList).filter(':checked');

                if ($selectedCheckboxs.size() > 0) {
                    // obtenho os nomes das respectivas
                    var selectedAgencyNames = '';
                    $selectedCheckboxs.parent().siblings('.details').children('.agencyName').each(function() {
                        selectedAgencyNames += ',' + $(this).text();
                    });

                    // obtenho os emails das respectivas
                    var selectedAgencyEmails = '';
                    $selectedCheckboxs.parent().siblings('.details').children('.agencyEmail').each(function() {
                        selectedAgencyEmails += ',' + $(this).text();
                    });

                    // obtenho os ids das respectivas
                    var selectedAgencyIDs = '';
                    $selectedCheckboxs.parent().siblings('.details').children('cite').each(function() {
                        selectedAgencyIDs += ',' + $(this).text();
                    });

                    // se collecionei algum valor, preencho a variavel de retorno
                    if (selectedAgencyNames.length > 0 && selectedAgencyEmails.length > 0) {
                        selectedAgencies = {
                            names: selectedAgencyNames.substr(1),
                            emails: selectedAgencyEmails.substr(1),
                            ids: selectedAgencyIDs.substr(1)
                        };
                    }
                }

                return selectedAgencies;
            };

            function RequestAndTriggerBindings() {

                $feedbacks.progressBar.hide();
                DataBind($settings.datasource);
            };

            function DataBind(datasource) {

                if (datasource.defaultQuestion != '' && datasource.defaultQuestion != undefined) {
                    $settings.defaultText = datasource.defaultQuestion;
                }

                if (datasource.agencies.length > 0) {

                    // build html
                    $.each(datasource.agencies, function(index, agency) {

                        if (agency.Name != '' && agency.Email != '') {

                            var $agencyItem = $('<div class="agencyInfo"/>');
                            var $agencyItem_selector = $('<div class="selector">').append($('<input type="checkbox"/>').attr('id', 'ck' + agency.ID).attr('checked', true));
                            var $agencyItem_logo = $('<div class="logo">').append($('<a>').attr('href', agency.Url).attr('target', '_blank').append($('<img>').attr('src', agency.Logo).attr('alt', agency.Name)));
                            var $agencyItem_details = $('<div class="details">').append($('<a>').attr("class", "agencyName").attr('title', agency.Name).attr('href', agency.Url).attr('target', '_blank').text(agency.Name))
                                                                                .append($('<a>').attr("class", "agencyEmail").attr('href', 'mailto:' + agency.Email).text(agency.Email))
                                                                                .append($('<cite>').text(agency.ID).hide());
                            var $agencyItem_floatClear = $('<div class="fClear"></div>')

                            $agencyItem.append($agencyItem_selector)
                                       .append($agencyItem_logo)
                                       .append($agencyItem_details)
                                       .append($agencyItem_floatClear);

                            $agencyItem_logo.children('img').error(function() {
                                $(this).hide();
                            });

                            $stage.agenciesList.prepend($agencyItem);

                        }

                    });

                    // expand & collapse
                    if ($settings.maxVisibleAgencies > 0) {
                        if ($stage.agenciesList.children('.agencyInfo').size() > $settings.maxVisibleAgencies) {
                            $stage.agenciesList.children('.agencyInfo:gt(' + ($settings.maxVisibleAgencies - 1) + ')').hide();
                            $links.expand.show();
                        }
                    }
                    else {
                        $links.expand.hide();
                        $links.collapse.hide();
                    }

                    // reset form
                    ReadyForm();

                    if ($settings.defaultText !== undefined) {
                        $contactForm.questions.text($settings.defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
                    }
                }
                else {
                    // não exixtem mediadoras
                }

            };

            $contactForm.send.click(function() {

                $feedbacks.requiredFields.hide();
                $feedbacks.invalidEmail.hide();
                $feedbacks.invalidPhone.hide();

                if (IsFormValid()) {

                    LockContactForm();
                    $feedbacks.loading.show();

                    // - obter as agencias seleccionadas agencies={nomes[], emails[]}
                    var agencies = GetSelectedAgencies();
                    if (agencies !== undefined) {

                        // - chamar o handler que envia o e-mail
                        if ($settings.url_dataTarget != '') {
                            $.ajax({
                                type: 'POST',
                                dataType: 'json',
                                processData: true,
                                timeout: $settings.requestTimeout,
                                url: $settings.url_dataTarget,
                                data: {
                                    userName: $contactForm.name.val(),
                                    userEmail: $contactForm.email.val(),
                                    userPhone: $contactForm.phone.val(),
                                    questions: $contactForm.questions.val(),
                                    agencyIDs: agencies.ids
                                },
                                error: function(request, status, error) {
                                    $feedbacks.loading.hide();
                                    $feedbacks.error.show();
                                    UnlockContactForm();

                                },
                                success: function(data) {
                                    $feedbacks.loading.hide();
                                    if (data.success == "1") {
                                        $feedbacks.success.show();
                                        UnlockContactForm();
                                        INIT();
                                    }
                                    else {
                                        $feedbacks.error.show();
                                        UnlockContactForm();
                                    }
                                }
                            });
                        }
                        else {
                            alert('DataSource URL not defined!');
                        }

                    };

                }

                return false;
            });

            function IsFormValid() {

                // - required fields
                if ($contactForm.name.val() == '' || $contactForm.phone.val() == '' || $contactForm.email.val() == '' || $contactForm.questions.val() == '') {
                    $feedbacks.requiredFields.show();
                    return false;
                }

                // - valid email 
                if (!IsValidEmail($contactForm.email.val())) {
                    $feedbacks.invalidEmail.show();
                    return false;
                }
                
                // - valid phone 
                if (!IsValidPhone($contactForm.phone.val())) {
                    $feedbacks.invalidPhone.show();
                    return false;
                } 

                return true;
            };

            $links.expand.click(function() {
                $stage.agenciesList.children('.agencyInfo:gt(' + ($settings.maxVisibleAgencies - 1) + ')').slideDown();
                $('img', $stage.agenciesList.children('.agencyInfo:gt(' + ($settings.maxVisibleAgencies - 1) + ')')).show();
                $links.expand.hide();
                $links.collapse.show();
                return false;
            });

            $links.collapse.click(function() {
                $stage.agenciesList.children('.agencyInfo:gt(' + ($settings.maxVisibleAgencies - 1) + ')').slideUp();
                $links.expand.show();
                $links.collapse.hide();
                return false;
            });


        });

    };
})(jQuery);




/* @@ Contact Agencies From Properties
   ==================================================================== */

function Setup_ContactAgenciesFromProperties(cid_control, url_dataSource, url_dataTarget, requestTimeout, languageID, locationID, defaultText, userInfoJSON) {
     
     var $control = $('#' + cid_control);
    

     $control.BuildContactAgenciesFromProperties({
        cid_control: cid_control,
        url_dataSource: url_dataSource,
        url_dataTarget: url_dataTarget,
        requestTimeout: Number(requestTimeout),
        locationID: locationID,
        defaultText: defaultText,
        userInfo: jQuery.parseJSON(userInfoJSON),
        languageID: languageID
    });
};


(function($) {
    $.fn.BuildContactAgenciesFromProperties = function(pluginSettings) {

        var defaultSettings = {
            cid_control: '',
            url_dataSource: '',
            url_dataTarget: '',
            requestTimeout: 5000,
            languageID: 'pt-PT',
            locationID: '',
            userInfo:''
        };
        var $settings = $.extend(defaultSettings, pluginSettings);

        return this.each(function() {
            

            // @ Declarations ............................................................................
            // ......................................................................................

            var $stage = {
                contactForm: $('#dAgenciesContactForm', $(this))
            };

            var $contactForm = {
                name: $('#txtName', $stage.contactForm),
                email: $('#txtEmail', $stage.contactForm),
                phone: $('#txtPhone', $stage.contactForm),
                questions: $('#txtQuestions', $stage.contactForm),
                send: $('#btnSend', $stage.contactForm)
            };


            var $feedbacks = {
                success: $('.successSending', $stage.contactForm),
                error: $('.errorSending', $stage.contactForm),
                loading: $('.loading', $stage.contactForm),
                requiredFields: $('.requiredFields', $stage.contactForm),
                invalidEmail: $('.invalidEmail', $stage.contactForm),
                invalidPhone: $('.invalidPhone', $stage.contactForm),
                progressBar: $('.progressBar', $stage.agenciesList),
                generalError: $('.containerErrors_icn', $(this)),
                generalErrorMsg: $('.containerErrors_msg', $stage.agenciesList)
            };

            // @ Init ............................................................................
            // ......................................................................................

            $feedbacks.success.hide();
            $feedbacks.error.hide();
            $feedbacks.loading.hide();
            $feedbacks.requiredFields.hide();
            $feedbacks.invalidEmail.hide();
            $feedbacks.invalidPhone.hide();
            $feedbacks.progressBar.hide();
            $feedbacks.generalError.hide();
            $feedbacks.generalErrorMsg.hide();

            function INIT() {
                $contactForm.name.val($settings.userInfo.Name);
                $contactForm.email.val($settings.userInfo.Email);
                $contactForm.phone.val($settings.userInfo.Phone);
                $contactForm.questions.text($settings.defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));
         
            }
            INIT();
            
            
            //  PrintSettings();                        
            ReadyForm();
           // RequestAndTriggerBindings();





            // @ Methods ............................................................................
            // ......................................................................................

          
            function ReadyForm(defaultText) {
                
                    UnlockContactForm();

            };

            function LockContactForm() {
                $contactForm.name.hide();
                $contactForm.email.hide();
                $contactForm.phone.hide();
                $contactForm.questions.hide();
                $contactForm.send.hide();
            };

            function UnlockContactForm() {
                $contactForm.name.show();
                $contactForm.email.show();
                $contactForm.phone.show();
                $contactForm.questions.show();
                $contactForm.send.show();
            };

            function GetSelectedAgencies() {
                var selectedAgencies;
                selectedAgencies =  RequestAgenciesIDs();
       
                var agencies='';
                if (selectedAgencies !== undefined && selectedAgencies!=null){
                    
                    $.each(selectedAgencies, function(index, agency){
                        agencies+=agency.ID + ',';
                    });

                }

                return agencies;
            };


            function RequestAgenciesIDs(){
                var agencies=null;
                  // 0. faço o pedido assincrono ao handler
                $.ajax({
                    type: 'GET',
                    timeout: $settings.requestTimeout,
                    url: $settings.url_dataSource,
                    processData: true,
                    async: false,
                    cache:false,
                    data: {
                        locationToken: '',
                        nameToken: '',
                        locationIDs: $settings.locationID
                    },
                    dataType: 'json',
                    success: function(data) {
                        // 2.1. carrego os dados
                        if(data != null){
                            agencies=data.agencies;
                        }  

                    }
                });

                return agencies;
            }

         
        
            $contactForm.send.click(function() {

                $feedbacks.requiredFields.hide();
                $feedbacks.invalidEmail.hide();
                $feedbacks.invalidPhone.hide();

                if (IsFormValid()) {
                    
                    LockContactForm();
                    $feedbacks.loading.show();


                    // - obter as agencias seleccionadas agencies={nomes[], emails[]}
                    var agencies = GetSelectedAgencies();

                    if (agencies !== undefined && agencies!=null) {
                        

                        // - chamar o handler que envia o e-mail
                        if ($settings.url_dataTarget != '') {
                            $.ajax({
                                type: 'POST',
                                dataType: 'json',
                                processData: true,
                                timeout: $settings.requestTimeout,
                                url: $settings.url_dataTarget,
                                data: {
                                    userName: $contactForm.name.val(),
                                    userEmail: $contactForm.email.val(),
                                    userPhone: $contactForm.phone.val(),
                                    questions: $contactForm.questions.val(),
                                    agencyIDs: agencies
                                },
                                error: function(request, status, error) {
                                    $feedbacks.loading.hide();
                                    $feedbacks.error.show();
                                    UnlockContactForm();
                                },
                                success: function(data) {
                                    $feedbacks.loading.hide();
                                    if (data.success == "1") {
                                        $feedbacks.success.show();
                                        UnlockContactForm();
                                        INIT();
                                    }
                                    else {
                                        $feedbacks.error.show();
                                        UnlockContactForm();
                                    }
                                }
                            });
                        }
                        else {
                            alert('DataSource URL not defined!');
                        }

                    }else{
                        $feedbacks.error.show();
                        UnlockContactForm();
                        
                    }

                }

                return false;
            });


            function IsFormValid() {

                // - required fields
                if ($contactForm.name.val() == '' || $contactForm.phone.val() == '' || $contactForm.email.val() == '' || $contactForm.questions.val() == '') {
                    $feedbacks.requiredFields.show();
                    return false;
                }

                // - valid email                
                if (!IsValidEmail($contactForm.email.val())) {
                    $feedbacks.invalidEmail.show();
                    return false;
                }

                // - valid phone 
                if (!IsValidPhone($contactForm.phone.val())) {
                    $feedbacks.invalidPhone.show();
                    return false;
                } 
                

                return true;
            };


        });

    };
})(jQuery);








/* @@ Contact Agencies From Properties Overlay
   ==================================================================== */

function Setup_ContactAgenciesFromPropertiesOverlay(cid_control,imgContactAgencies, url_dataSource, url_dataTarget, requestTimeout, languageID, locationID, defaultText, userInfoJSON) {
     
     var $control = $('#' + cid_control);
    
     $control.BuildContactAgenciesFromPropertiesOverlay({
        cid_control: cid_control,
        url_dataSource: url_dataSource,
        url_dataTarget: url_dataTarget,
        requestTimeout: Number(requestTimeout),
        defaultText: defaultText,
        userInfo: jQuery.parseJSON(userInfoJSON),
        languageID: languageID,
        imageTrigger:imgContactAgencies,
        locationID:locationID
    });
};


(function($) {
    $.fn.BuildContactAgenciesFromPropertiesOverlay = function(pluginSettings) {

        var defaultSettings = {
            cid_control: '',
            url_dataSource: '',
            url_dataTarget: '',
            requestTimeout: 5000,
            languageID: 'pt-PT',
            propertyIDs: '',
            defaultText: '',
            typesIDs: '',
            purposeIDs: '',
            locationID: '',
            beds: -1,
            bedsMin: -1,
            bedsMax: -1,
            maxVisibleAgencies: 0,
            userInfo:'',
            imageTrigger:''
        };
        var $settings = $.extend(defaultSettings, pluginSettings);

        return this.each(function() {
            

            // @ Declarations ............................................................................
            // ......................................................................................

            var $stage = {
                contactForm: $('#dAgenciesContactForm', $(this)),
                overlayDiv : $(this),
                overlayDivChildren : $(this).children('div')

            };

            var $imgContactAgencies= $('#' + $settings.imageTrigger);
         
            var $contactForm = {
                name: $('#txtName', $stage.contactForm),
                email: $('#txtEmail', $stage.contactForm),
                phone: $('#txtPhone', $stage.contactForm),
                questions: $('#txtQuestions', $stage.contactForm),
                send: $('#btnSend', $stage.contactForm)
            };


            var $feedbacks = {
                success: $('.successSending', $stage.contactForm),
                error: $('.errorSending', $stage.contactForm),
                loading: $('.loading', $stage.contactForm),
                requiredFields: $('.requiredFields', $stage.contactForm),
                invalidEmail: $('.invalidEmail', $stage.contactForm),
                invalidPhone: $('.invalidPhone', $stage.contactForm),
                progressBar: $('.progressBar', $stage.agenciesList),
                generalError: $('.containerErrors_icn', $(this)),
                generalErrorMsg: $('.containerErrors_msg', $stage.agenciesList)
            };

            // @ Init ............................................................................
            // ......................................................................................

            
            var _processing = false;

            $imgContactAgencies.click(function(){
                    
                    SetupOverlayDivPositioning();
                    $feedbacks.success.hide();
                    $feedbacks.error.hide();
                    $feedbacks.loading.hide();
                    $feedbacks.requiredFields.hide();
                    $feedbacks.invalidEmail.hide();
                    $feedbacks.invalidPhone.hide();
                    $feedbacks.progressBar.hide();
                    $feedbacks.generalError.hide();
                    $feedbacks.generalErrorMsg.hide();
                    INIT();
                    $stage.overlayDiv.fadeIn();

                    return false;
                });

            function INIT() {

                

                $contactForm.name.val($settings.userInfo.Name);
                $contactForm.email.val($settings.userInfo.Email);
                $contactForm.phone.val($settings.userInfo.Phone);
                $contactForm.questions.text($settings.defaultText.ReplaceAll('<br/>', String.fromCharCode(13)));

                $(window).scroll(function() {
                    SetupOverlayDivPositioning();
                });

                // close button
                $('.closeOverlay',  $stage.overlayDivChildren).unbind('click').click(function() {
                    if (!_processing) {
                            $stage.overlayDiv.hide();
                    }
                    return false;
                });

                $(window).bind('resize', function() { SetupOverlayDivPositioning(); });

                $stage.overlayDivChildren.click(function(e) { /*e.stopPropagation();*/ });

                $(document).keydown(function(e) {
                    if (e.keyCode == _keyboard.escape) {
                            $stage.overlayDiv.hide();
                    }
                });

                   

            }
            //INIT();
            
             function SetupOverlayDivPositioning() {
                        $stage.overlayDiv.css('top', $(window).scrollTop());
                        $stage.overlayDiv.css('height', $(window).height());
                };
            
            //  PrintSettings();                        
            ReadyForm();
         
            // @ Methods ............................................................................
            // ......................................................................................

            function PrintSettings() {
                console.log('cid_control: ' + $settings.cid_control);
                console.log('url_dataSource: ' + $settings.url_dataSource);
                console.log('url_dataTarget: ' + $settings.url_dataTarget);
                console.log('requestTimeout: ' + $settings.requestTimeout);
                console.log('languageID: ' + $settings.languageID);
                console.log('propertyIDs: ' + $settings.propertyIDs);
                console.log('defaultText: ' + $settings.defaultText);

                console.log('typesIDs: ' + $settings.typesIDs);
                console.log('purposeIDs: ' + $settings.purposeIDs);
                console.log('locationIDs: ' + $settings.locationIDs);
                console.log('beds: ' + $settings.beds);
            };

            function ReadyForm(defaultText) {
                
                    UnlockContactForm();

            };

            function LockContactForm() {
                $contactForm.name.hide();
                $contactForm.email.hide();
                $contactForm.phone.hide();
                $contactForm.questions.hide();
                $contactForm.send.hide();
            };

            function UnlockContactForm() {
                $contactForm.name.show();
                $contactForm.email.show();
                $contactForm.phone.show();
                $contactForm.questions.show();
                $contactForm.send.show();
            };

            function GetSelectedAgencies() {
                var selectedAgencies;
                selectedAgencies =  RequestAgenciesIDs();
       
                var agencies='';
                if (selectedAgencies !== undefined && selectedAgencies!=null){
                    
                    $.each(selectedAgencies, function(index, agency){
                        agencies+=agency.ID + ',';
                    });

                }

                return agencies;
            };


            function RequestAgenciesIDs(){
                var agencies=null;
                  // 0. faço o pedido assincrono ao handler
                $.ajax({
                    type: 'GET',
                    timeout: $settings.requestTimeout,
                    url: $settings.url_dataSource,
                    processData: true,
                    async: false,
                    data: {
                        locationToken: '',
                        nameToken: '',
                        locationIDs: $settings.locationID
                    },
                    dataType: 'json',
                    success: function(data) {
                        // 2.1. carrego os dados
                        if(data != null){
                            agencies=data.agencies;
                        }  

                    }
                });

                return agencies;
            }

         
        
            $contactForm.send.click(function() {

                $feedbacks.requiredFields.hide();
                $feedbacks.invalidEmail.hide();
                $feedbacks.invalidPhone.hide();

                if (IsFormValid()) {
                    
                    LockContactForm();
                    $feedbacks.loading.show();


                    // - obter as agencias seleccionadas agencies={nomes[], emails[]}
                    var agencies = GetSelectedAgencies();

                    if (agencies !== undefined && agencies!=null) {
                        

                        // - chamar o handler que envia o e-mail
                        if ($settings.url_dataTarget != '') {
                            $.ajax({
                                type: 'POST',
                                dataType: 'json',
                                processData: true,
                                timeout: $settings.requestTimeout,
                                url: $settings.url_dataTarget,
                                data: {
                                    userName: $contactForm.name.val(),
                                    userEmail: $contactForm.email.val(),
                                    userPhone: $contactForm.phone.val(),
                                    questions: $contactForm.questions.val(),
                                    agencyIDs: agencies
                                },
                                error: function(request, status, error) {
                                    $feedbacks.loading.hide();
                                    $feedbacks.error.show();
                                    UnlockContactForm();
                                },
                                success: function(data) {
                                    $feedbacks.loading.hide();
                                    if (data.success == "1") {
                                        $feedbacks.success.show();
                                        UnlockContactForm();
                                        INIT();
                                    }
                                    else {
                                        $feedbacks.error.show();
                                        UnlockContactForm();
                                    }
                                }
                            });
                        }
                        else {
                            alert('DataSource URL not defined!');
                        }

                    }else{
                        $feedbacks.error.show();
                        UnlockContactForm();
                        
                    }

                }

                return false;
            });

            function IsFormValid() {

                // - required fields
                if ($contactForm.name.val() == '' || $contactForm.phone.val() == '' || $contactForm.email.val() == '' || $contactForm.questions.val() == '') {
                    $feedbacks.requiredFields.show();
                    return false;
                }

                // - valid email                
                if (!IsValidEmail($contactForm.email.val())) {
                    $feedbacks.invalidEmail.show();
                    return false;
                }

                // - valid phone 
                if (!IsValidPhone($contactForm.phone.val())) {
                    $feedbacks.invalidPhone.show();
                    return false;
                } 
                

                return true;
            };


        });

    };
})(jQuery);
