var ratingDialog;
CompanyRating = newClass(Dialog, {

    initChild: function() {
        ratingDialog = this;
    	var reviewsContainer = $('#reviews-container');
    	var skrivContainer = reviewsContainer.find(".skriv");
    	this.skriv = window.location.hash == "#skriv" || (skrivContainer.length > 0 && skrivContainer.attr("title").length > 0);
        this.needOpenDialog =  this.skriv || reviewsContainer.length == 0;
		this.form = $("#reviewForm");
		this.form.bind("submit", {env: this}, this.sendRating);
        this.dialog = $("#review-dialog-body");
        var verificationBox = $("#email-verification-box");
        var dialog = this.dialog;
        this.header = $("#review-header");
        this.publishToFacebookWallChecker = dialog.find("#review-send-to-facebook");
        this.useTimeLinePosting = this.publishToFacebookWallChecker.size() == 0;

        dialog.find("#review-email").bind("change keyup blur", {env: this}, this.checkSendMailOnResponse);
        if (!this.useTimeLinePosting) {
        	this.publishToFacebookWallChecker.bind("click", {env: this}, this.clickPublishToFB);
        }

        dialog.find("#review-message").bind("paste", {env: this}, this.reviewSetTimeout);
        dialog.find("#review-new-captcha-link").bind("click", {}, this.reloadCaptcha);
        dialog.find("#reset-dialog-observer").bind("click", {env:this}, this.clearReviewInputs);
	    dialog.find("#review-name").val('');
	    dialog.find("#review-message").val('');
        verificationBox.find("#send-review").bind("click", {env: this}, this.sendRating);
        verificationBox.find("#change-email").bind("click", {env: this}, this.abortVerification);
        ratingDialog = this;
        this.jsCommonData=null;
        this.params = new Object();
        $("#rate-popup-draggable").draggable({containment: "document"});
        this.isopened=false;
        this.sendClicked=false;
        this.emailCheckerEnabled = false;
        if (this.needOpenDialog) {
            if (this.skriv){
    	    	this.scrollToRatingForm();
            }
            $("#review-rating-stars").click();
        }
        var newsReviewsCount = $("#new-reviews").children().length;
        var oldReviewsCount = $("#old-reviews").children().length;
        if (newsReviewsCount > 0 && oldReviewsCount > 0){
            var oldReviews = $("#old-reviews");
            var reviewHeader = $("#review-list-header:first");
            reviewsContainer.find(".hide-old-reviews:first").bind("click", {oldReviews :oldReviews, reviewsContainer:reviewsContainer}, this.showOldReviewsToggle);
            reviewsContainer.find(".show-all-reviews:first").bind("click", {oldReviews :oldReviews, reviewsContainer:reviewsContainer}, this.showOldReviewsToggle);
        }
	},

	closeDialog: function() {
        this.dialog.slideToggle("slow");
        this.isopened = false;
        ratingDialog.dialog.find("#review-name").val('');
        ratingDialog.dialog.find("#review-message").val('');
        starsBlock.resetToDefault();
	},

	clearReviewInputs: function(e) {
        var env = e.data.env;
        var dialog = env.dialog;
	    dialog.find("#review-signature").val('');
	    dialog.find("#review-email").val('');
	    dialog.find("#review-captcha-value").val('');
	    if (!env.useTimeLinePosting) {
	    	if (facebookUtils.uid){
	    		env.publishToFacebookWallChecker.attr('checked', 'checked');
	    	} else{
	    		env.publishToFacebookWallChecker.attr('checked', '');
	    	}
	    }
	    if (facebookUtils.uid){
	    	dialog.find("#review-send-as-anonymous").attr('checked', '');
        }
	    clearValidationResult(dialog);
	},

	showOldReviewsToggle :function(e) {
		e.data.oldReviews.slideToggle("slow");
		var reviewsContainer = e.data.reviewsContainer;
		reviewsContainer.find(".hide-old-reviews:first").toggleClass("invisible");
		reviewsContainer.find(".show-all-reviews:first").toggleClass("invisible");
	},

	reviewSetTimeout :function() {
            setTimeout(function() {$("#review-message").keyup();}, 100);
    },

    clickPublishToFB: function(e){
        var env = e.data.env;
        fbAsync(function(){
            facebookUtils.ifUserConnected(function(){}, function() {
                facebookUtils.facebookConnect(false);
            });
        });
    },

    publishToFB: function(submissionId) {
        var dialog = ratingDialog.dialog;
        var reloadFunc = function() { window.location.reload(); };
        var willBePost = (this.useTimeLinePosting && $("#review-send-to-timeline").attr("checked"))
        			  || (this.publishToFacebookWallChecker.size() >0 && this.publishToFacebookWallChecker.is(':checked'));
        if (willBePost) {
            if (this.useTimeLinePosting){
            	facebookUtils.timelineCompanyRate(reloadFunc);
            } else{
                var name = this.jsCommonData["feedName"];
                var href = this.jsCommonData["reviewLink"] + "#" + submissionId;
                var description = $.trim($(dialog).find("#review-message").val());
                if (description.length > 150){
                	description = description.substring(0,150);
                }
                var attachmentSrc = this.jsCommonData["attachmentSrc"];
                var attachmentLink = this.jsCommonData["attachmentLink"];
                var media = [{'type':'image', 'src':attachmentSrc, 'href':attachmentLink}];

                var attachment = {'media':media,
                    'name': name,
                    'href':href,
                    'caption':'',
                    'description': description
                };

                var rejtaLabel = $.trim($(dialog).find("#review-facebook-rejtaLabel").html());
                var rejtaLink = $.trim($(dialog).find("#review-facebook-rejtaLink").html());
                var actionLink = [
                    {'text': rejtaLabel, 'href':rejtaLink}
                ];

                var question = $.trim($(dialog).find("#review-facebook-question").html());
                facebookUtils.publish(attachment, actionLink, question, function() {
                	setTimeout(reloadFunc, 1000);
            	});
            }
        } else {
            setTimeout(reloadFunc, 1000);
        }
    },


/**
 * opens dialog to send rating and review
 */
    openRateDialog: function() {
    	var env = this;
    	if (this.isopened) {
    		this.scrollToRatingForm();
    		return;
    	}
        //env.sendClicked = false;
	    if ($.cookie(this.jsCommonData["ratingTargetId"]) >= this.jsCommonData["maxRatingCount"]) {
            showMessageParam(this.jsCommonData["errorTitle"], this.jsCommonData["errorMessage"], false);
	    } else {
	    	this.header.removeClass("hidden");
	    	this.header.find(".block-tl:first").css("display","none");
	    	this.dialog.slideDown("slow");
	    	if(typeof this.starContainer!="undefined" && this.starContainer!=this.jsCommonData["container"]){
	            starWrappers[this.starContainer].resetToDefault();
	        }
	        this.starContainer = this.jsCommonData["container"];
	        fbAsync(function(){
			    if (facebookUtils.uid){
			    	env.emailCheckerEnabled = false;
			    }else{
		            var checkEmailUrl = "/" + $("#review-check-email-url").html();
		            $.ajax({
		                type: "POST",
		                dataType: "json",
		                url: checkEmailUrl,
		                data: "",
		                success: function(data) {
		                    if (data.status == "EMAIL_REQUIRED") {
		                        env.emailCheckerEnabled = true;
		            	        this.reloadCaptcha();
		                    }
		        	        countSymbolsLeftForTextArea(65535, "#review-message", "#review-symbols-count");
		        	        $("#review-name").focus();
		                },
		                error: function(XMLHttpRequest, textStatus, errorThrown) {
		                }
		            });
			    }
			    env.isopened=true;
	        });
	    }
	},

	sendRating: function(e) {
		var env = e.data.env;
		if (!env.sendClicked){
			env.sendClicked = true;
	        fbAsync(function(){
				env.sentData = e;
	        	if(facebookUtils.uid) {
	        		facebookUtils.ifUserConnected(function() {
	        			env.__sendRating();
	        		}, function(){
	        			showMessageParam(env.dialog.find("#loggin-dialog-title").attr("title"), env.dialog.find("#loggin-dialog-message").attr("title"), false, 100000);
	        			env.sendClicked = false;
	        		}, false);
	        	} else {
	        		env.__sendRating();
	        	}
	        });
		}
        return false;
    },

/**
 * Performs validation for review dialog form,
 * in case validation passed well sends AJAX request.
 */
    __sendRating: function() {
    	$("#message-box").hide("fast");
    	var e = ratingDialog.sentData;
		var env = e.data.env;
        var dialog = env.dialog;

	    var reviewTitle = $(dialog).find("#review-name");
	    var reviewTitleText = $.trim($(reviewTitle).val());
	    var reviewMsg = $(dialog).find("#review-message");
	    var reviewMsgText = $.trim($(reviewMsg).val());
	    var reviewSignature = $(dialog).find("#review-signature");
	    var reviewSignatureText = $.trim($(reviewSignature).val());

        var reviewEmail = $(dialog).find("#review-email");
        var reviewEmailText = $.trim($(reviewEmail).val());
        var captchaValue = $("#review-captcha-value").val();
	    /*todo remove!!!*/
        /////////////////////////////////////////////////////
        var rating = $(dialog).find("#review-rating");
	    var ratingValue = $.trim(rating.val());
        /////////////////////////////////////////////////////
	    var reviewCaptchaValue = $(dialog).find("#review-captcha-value");
        var isAnonymous = $("#review-send-as-anonymous").is(':checked');
        var userId = facebookUtils.uid;
        env.params = new Object();
        var params = env.params;
        if (userId && userId != null) {
            params["fb_sig_user"] = userId;
        }
        params["source_email"] = reviewEmailText;
        params["review_title"] = reviewTitleText;
        params["review_text"] = reviewMsgText;
        params["source_alias"] = reviewSignatureText;
        params["rating"] = ratingValue;
        params["send_mail_on_response"] = userId || (reviewEmail.val().length > 0);
        params["is_anonymous"] = isAnonymous;
        params["rating_target_id"] = env.jsCommonData["ratingTargetId"];
        params["advert_code"] = env.jsCommonData["advCode"];
        params["customer_code"] = env.jsCommonData["customerCode"];
        params["company_name"] = env.jsCommonData["companyName"];
        params["logo_fullpath"] = env.jsCommonData["logoFullPath"];
        params["additionalinfo_url"] = env.jsCommonData["additionalInfoUrl"];
        params["additionalinfo_label"] = env.jsCommonData["additionalInfoLabel"];
        params["captcha_value"] = captchaValue;
        params["masked_action"] = "submit_ratereview";
	    env.validationData = {
	        "review.long.reviewTitle":    {messageId:"#review-long-name-error",       validator:validateLengthLessThan,     jqField:reviewTitle, 			criteria:51},
            "review.incorrect.reviewText":{messageId:"#advice-incorrect-message",     validator:validateLengthLessThan,		jqField:reviewMsg,   			criteria:65536},
            "review.short.reviewText":{messageId:"#advice-incorrect-message",     validator:validateLengthGreaterThan,  jqField:reviewMsg,   			criteria:2},
	        "review.long.signature":      {messageId:"#review-long-signature-error",  validator:validateLengthLessThan,     jqField:reviewSignature,		criteria:26},
	        "review.long.sourceEmail":    {messageId:"#review-long-email-error",      validator:validateLengthLessThan,     jqField:reviewEmail, 			criteria:101},
	        "review.empty.sourceEmail":   {messageId:"#review-empty-email-message",   validator:validateIf,                 jqField:reviewEmail, 			criteria: !env.emailCheckerEnabled || userId || (reviewEmail.val().length > 0 )},
	        "review.invalid.sourceEmail": {messageId:"#advice-wrong-email-message",   validator:validateForRegExpPattern,   jqField:reviewEmail, 			criteria:"(?:^\\s*$)|(?:^(?:\\w+(?:[\\.\\+-]{1}\\w+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}(?:(?:\\s*,\\s*)|$))+)$"},
	        "review.empty.rating":        {messageId:"#review-empty-rating-error",    validator:validateNotEmptyAndNotZero, jqField:rating},
	        "review.invalid.rating":      {messageId:"#review-empty-rating-error",    validator:validateForRegExpPattern,   jqField:rating,					criteria: "(?:^\\s*$)|(?:^\\d{1})$"},
	        "review.empty.captcha":       {messageId:"#review-empty-captcha-error",   validator:validateIf,  				jqField:reviewCaptchaValue, 	criteria: env.emailCheckerEnabled || userId || captchaValue.length > 0},
	        "review.invalid.captcha":     {messageId:"#review-invalid-captcha-error", validator:validateLengthLessThan,  	jqField:reviewCaptchaValue, 	criteria: 20}
	    };
        if (userId) {
	        if (formValidation(env.validationData)){
	        	env.__postReview(e, true);
	        } else{
	        	updateFrameSize(dialog.find(".dialog"), dialog.find(".banner-fix:first"));
            	env.sendClicked = false;
	        }
        } else {
            enableLoadingBlock(true);
            var checkEmailUrl = "/" + $("#review-check-email-url").html();
            $.ajax({
                type: "POST",
                dataType: "json",
                url: checkEmailUrl,
                data: params,
                success: function(data) {
                    clearValidationResult(dialog);
                    var validation = true;
                    if (data.status == "EMAIL_REQUIRED") {
                        markValidationFailed("#review-empty-email-message", reviewEmail);
                        validation = false;
                    }
                    if (validation & formValidation(env.validationData)) {
                        enableLoadingBlock(false);
                        env.__postReview(e, data.status == "OK" || data.status == "");
                    } else {
                    	env.sendClicked = false;
                        updateFrameSize(dialog.find(".dialog"), dialog.find(".banner-fix:first"));
                        enableLoadingBlock(false);
                    }
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    var response = typeof XMLHttpRequest.responseText == 'string' ? XMLHttpRequest.responseText.substring(0,150): "";
                    showMessageParam(null, textStatus + "<br/>" + response, true);
                    enableLoadingBlock(false);
                }
            });
        }
        return false;
    },

    __postReview: function(e, emailVerified) {
        var env = e.data.env;
        var params = env.params;
        var dialog = env.dialog;
        if (emailVerified) {
        	if (params["fb_sig_user"]) {
        		facebookUtils.getEmailForCurrentUser(function(email){
        			params["source_email"] = facebookUtils.email;
        			env.postReview(e);
                });
            } else{
                env.postReview(e);
            }
        } else {
            enableLoadingBlock(true);
            var verificationBox = $("#email-verification-box");
            verificationBox.css({left:dialog.offset().left + 10 + 'px', top:dialog.offset().top + 138 + 'px'});
            verificationBox.find("#verification-email").html(params["source_email"]);
            verificationBox.show();
        }
	    return false;
	},

    postReview: function(e) {
        var env = e.data.env;
        var url = "/" + $("#review-post-url").html();
        $('#email-verification-box').hide();
        env.jsCommonData["reloadPage"] = true;//for releware
        env.postWithAjax(env, url, env.params, env.validationData, env.dialog, function(data){
            gaUtils.addRating(env.params["rating"]);
            env.publishToFB(data.submission_id);
        }, function(){
            ratingDialog.reloadCaptcha();
        });
    },

    checkSendMailOnResponse: function(e) {
        var env = e.data.env;
        if (!env.dialog.find("#review-email").hasClass("invisible")){
            var length = env.dialog.find("#review-email").attr('value').length;
            $("#review-send-mail-on-response").attr('checked', (length > 0) ? 'checked' : '');
        }
	},

    abortVerification: function(e) {
        $('#email-verification-box').hide();
        enableLoadingBlock(false);
	},

	reloadCaptcha: function () {
		ratingDialog.sendClicked = false;
		var captchaImg = $("#review-captcha-img");
		var src = captchaImg.attr("src");
		var pos = src.indexOf("?");
		if (pos >= 0) {
			src = src.substr(0, pos);
		}
		var date = new Date();
		captchaImg.attr("src", src + "?v=" + date.getTime());
		return false;
	},

	scrollToRatingForm: function () {
		 $(window).scrollTop(this.header.parents(".block-corners").offset().top - 10);
	}
});
$(document).ready(function() {
	new CompanyRating();
});
