TipsToFriend = newClass(Dialog, {

	initChild: function(options) {
		if (!(options && options.form)) {
			return;
        }
		this.form = $('#' + options.form);
		this.form.bind('submit', {env: this}, this.sendTip);
		$('#tips-to-friends-link').bind('click', {env: this}, this.openTipDialog);
		$('#tip-dialog-Xclose-link').bind('click', {env: this}, this.closeTipsDialog);
	},

    clearTipInputs: function() {
	    var dialog = $("#tip-dialog");
	    clearValidationResult(dialog);

	    dialog.find("#tip-message").val('');
	    dialog.find("#tip-recipient").val('');
	    dialog.find("#tip-sender-name").val('');
	    dialog.find("#tip-sender").val('');
	    dialog.find("#tip-captcha-value").val('');

	    updateFrameSize('#tip-dialog-frame', '#tip-dialog iframe');
	},
	
	closeTipsDialog: function() {
	    var dialog = $("#tip-dialog");

	    dialog.hide();
	    $('#tip-dialog-draggable').css({left:'',top:''});
	},

/**
 * shows and hides tip dialog,
 * @param open
 */
    openTipDialog: function(e) {
		var env = e.data.env;
	    var dialog = $("#tip-dialog");

		reloadImg('tip-captcha-img');
		// all other dialogs except "tip" should be hidden before open this
		hideOtherDialogs(dialog);
		var top_pos = getScrollTop();
		$('#tip-dialog-draggable').css({left:'',top:top_pos});
		// clear invalid validation
		env.clearTipInputs();
		countSymbolsLeftForTextArea(1000, "#tip-message", "#tip-symbols-count");
		$(dialog).show();
		updateFrameSize('#tip-dialog-frame', '#tip-dialog iframe');
	},

/**
 * performs JS validation on tip send,
 * sends AJAX request to server,
 * notifies user about success or error on sending.
 */
    sendTip: function(e) {
		var env = e.data.env;
	    var dialog = $("#tip-dialog");

	    clearValidationResult(dialog);

	    var messageField = $(dialog).find("#tip-message");
	    var text = $.trim($(messageField).val());
	    var emailRecipientField = $(dialog).find("#tip-recipient");
	    var emailRecipient = $.trim($(emailRecipientField).val());
	    var senderField = $(dialog).find("#tip-sender-name");
	    var sender = $.trim($(senderField).val());
	    var emailSenderField = $(dialog).find("#tip-sender");
	    var emailSender = $.trim($(emailSenderField).val());

	    var tipCaptcha = $(dialog).find("#tip-captcha-value");
	    var tipCaptchaValue = $.trim($(tipCaptcha).val());
	    var tipLinkValue = location.href;

	    var validationData = {
	        "tip.message.long":    {messageId:"#tip-long-message-error", validator:validateLengthLessThan,   jqField:messageField, criteria:1001},
	        "tip.to.long":    {messageId:"#tip-long-recipient-email-error",   validator:validateLengthLessThan,   jqField:emailRecipientField, criteria:1001},
	        "tip.to.empty":    {messageId:"#tip-empty-recipient-email-error",   validator:validateLengthGreaterThan,   jqField:emailRecipientField, criteria:0},
	        "tip.to.too.many":    {messageId:"#tip-too-many-recipients-email-error",   validator:validateEmailGroupsNumber,   jqField:emailRecipientField, criteria:10}, 
	        "tip.to.wrong":    {messageId:"#tip-wrong-recipient-email-error",   validator:validateForRegExpPattern,   jqField:emailRecipientField,
	            criteria:"(?:^\\s*$)|(?:^(?:\\w+(?:[\\.-]{1}\\w+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}(?:(?:\\s*,\\s*)|$))+)$"},

	        "tip.sender.long":    {messageId:"#tip-long-sender-error",   validator:validateLengthLessThan,   jqField:senderField, criteria:51},
	        "tip.sender.empty":    {messageId:"#tip-empty-sender-error",   validator:validateLengthGreaterThan,   jqField:senderField, criteria:0},

	        "tip.from.long":    {messageId:"#tip-long-sender-email-error",   validator:validateLengthLessThan,   jqField:emailSenderField, criteria:101},
	        "tip.from.empty":    {messageId:"#tip-empty-sender-email-error",   validator:validateLengthGreaterThan,   jqField:emailSenderField, criteria:0},
	        "tip.from.too.many":    {messageId:"#tip-too-many-sender-email-error",   validator:validateEmailGroupsNumber,   jqField:emailSenderField, criteria:1},
	        "tip.from.wrong":    {messageId:"#tip-wrong-sender-email-error",   validator:validateForRegExpPattern,   jqField:emailSenderField,
	            criteria:"(?:^\\s*$)|(?:^(?:\\w+(?:[\\.-]{1}\\w+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}(?:(?:\\s*,\\s*)|$))+)$"},

	        "review.empty.captcha":       {messageId:"#tip-empty-captcha-error",       validator:validateLengthGreaterThan,  jqField:tipCaptcha, criteria:0},
	        "review.invalid.captcha":     {messageId:"#tip-invalid-captcha-error",     validator:validateLengthLessThan,  jqField:tipCaptcha, criteria: 20}
	    };
	    if (!formValidation(validationData)) {
	        //calculate width and height as they change with error messages
	        updateFrameSize('#tip-dialog-frame', '#tip-dialog iframe');
	        // exit without sending AJAX
	        return false;
	    }

	    var params = new Object();
	    params["message"] = text;
	    params["to"] = emailRecipient;
	    params["sender_name"] = sender;
	    params["from"] = emailSender;
	    params["tip_link"] = tipLinkValue;
	    params["captcha_value"] = tipCaptchaValue;
	    // the ajax_get_cache is required, because of the AJAX request being cached.
	    params["ajax_get_cache"] = encodeURIComponent((new Date()).getTime());

	    var url = "/tips";

	    enableLoadingBlock(true);
	    $.ajax({
	        type: "POST",
	        dataType: "json",
	        url: url,
	        data: params,
	        success: function(data) {
	            enableLoadingBlock(false);
	            clearValidationResult(dialog);

	            if (env.handleResponse(data, validationData)) {
	                env.closeTipsDialog();
	            } else {
	                reloadImg('tip-captcha-img');
	                updateFrameSize('#tip-dialog-frame', '#tip-dialog iframe');
	            }
	        },
	        error: function(XMLHttpRequest, textStatus, errorThrown) {
	            enableLoadingBlock(false);
	            env.closeTipsDialog();
	            var response = typeof XMLHttpRequest.responseText == 'string' ? XMLHttpRequest.responseText.substring(0, 150) : "";
	            showMessageParam(null, textStatus + "<br/>" + response, true);
	        }
	    });
	    return false;
	}
});