var unknownError = "<span class='errorMessage'>The correction engine is not available, please try again later</span>";
var emptyInputError = "<span class='errorMessage'>Please enter text for correction</span>";
var textTooLongError = "<span class='errorMessage'>Your text is too long, please enter a shorter text</span>";
var noSuggestionText = "(No Suggestions)";
var initialMsg = "Type/paste your text for correction";
var tmpDiv = null;
var originalSentence = "";
var requestInProcess = false;
var webiteRootUrl = "http://www.gingersoftware.com/";
var widgetRootUrl = webiteRootUrl+"widget/";
var elementsPrefix = "GingerWidget-";

function getWidgetElementId(id) {
	return "#"+elementsPrefix+id;	
}

function validateInput() {
    return $(getWidgetElementId("originalTexInput")).val() != "";
}

function showProgress() {
	$(getWidgetElementId("editOriginalWrapper")).hide();
	$(getWidgetElementId("originalHtmlText")).show().html("<img src='"+widgetRootUrl+"images/points.gif' alt='' />");
	$(getWidgetElementId("separator")).css("margin", "12px 0 16px 0");
}

function showSuggestion() {
    $(getWidgetElementId("separator")).hide();
	$(getWidgetElementId("separator")).fadeOut(100, function(){
        $(getWidgetElementId("correctedText")).append('<span class="GingerWidget-leftCorner" style="background:url('+widgetRootUrl+'images/inputTop-left-corrected.png)"></span>');
		$(getWidgetElementId("correctedText")).fadeIn(100);
    });
}

function hideSuggestion() {
	$(getWidgetElementId("correctedText")).fadeOut(100, function(){
		$(getWidgetElementId("separator")).show();
		$(getWidgetElementId("separator")).fadeIn(100);
    });
}

function clearSuggestionField() {
	$(getWidgetElementId("correctedText")).html("");
}

function showHideAlternativesPopup(show) {
    $(getWidgetElementId("alternativesDiv")).css("visibility", show ? "visible" : "hidden");
    $(getWidgetElementId("alternativesInnerDiv")).css("visibility", show ? "visible" : "hidden").scrollTop(0);
}

function clearInitialMsg() {
	var orgTextInput = $(getWidgetElementId("originalTexInput"));
	if (orgTextInput.val() == initialMsg) {
		orgTextInput.val("");
	}
}

function clearPrevCorrections() {
	$(getWidgetElementId("separator")).css("margin", "16px 0 15px");
	$(getWidgetElementId("editOriginalWrapper")).show();
	$(getWidgetElementId("originalHtmlText")).hide();
    $(getWidgetElementId("originalTexInput")).val("").focus();
    clearSuggestionField();
	showHideAlternativesPopup(false);
	hideSuggestion();
	$(getWidgetElementId("originalTexInput")).unbind("click", clearPrevCorrections);
	requestInProcess = false;
}

function getCorrections(correctionText) {
	var original = "", correction = "", offset = 0, alternatives = new Array();
	try {
		var corrections = eval(correctionText);
		if (corrections == undefined || (corrections && corrections.error)) {
			return false;
		}
		
		for (var i=0; i<corrections.length; i++) {
			var currCorrection = corrections[i];
			alternatives[currCorrection.tokenIndex] = currCorrection.alternatives;
			addSentenceFragment(originalSentence, offset, currCorrection.tokenIndex);
			
			original += "<span class='mistake'>" + currCorrection.token + "</span>";
			correction += "<span class='alternate "+currCorrection.confidence.toLowerCase()+"' id='"+elementsPrefix+"alternate_"+currCorrection.tokenIndex+"'>"+currCorrection.alternativeForReplacement+"</span>";
			offset += currCorrection.token.length;
		}
		
		addSentenceFragment(originalSentence, offset, originalSentence.length);
		return {original:original, correction:correction, alternatives:alternatives};
	} catch (err) {
		return false;
	}
	
	function addSentenceFragment(sentence, start, end) {
		frag = sentence.substr(start, end-start);
		original += frag;
		correction += frag;
		offset += frag.length;
	}	
}

function validateReplyLength(correctedText) {
	if (tmpDiv == null) {
		tmpDiv = document.createElement('div');
		document.body.appendChild(tmpDiv);
	}
	$(tmpDiv).css({position: 'absolute', left: -1000, top: -1000, display: 'none'}).html(correctedText);
	w = $(tmpDiv).outerWidth();
	return w < $(getWidgetElementId("innerBox")).width();
}

function removeLeadingSpaces(text) {
	 return text.replace(/^\s+/, '');
}

function displayInputErrorMsg() {
	$(getWidgetElementId("editOriginalWrapper")).hide();
	$(getWidgetElementId("originalHtmlText")).show().html("");
	$(getWidgetElementId("correctedText")).html(emptyInputError);
	$(getWidgetElementId("originalTexInput")).bind("click", clearPrevCorrections);
	showSuggestion();
}

function repositionToolTip(parentObject) {
	var tooltipOffsetTop = parentObject.offsetTop;
    var balloonWidthNoTip = $(getWidgetElementId('innerBox')).width() / 2;
    var permittedLeftLimit = -10;
	if ($.browser.msie && jQuery.browser.version < 8) {
		tooltipOffsetTop = parentObject.offsetTop + parentObject.parentNode.offsetTop;
	}
	
	var mainContent = $(getWidgetElementId("mainContent"));
	var left = mainContent.offset().left;
	var top = mainContent.offset().top + parentObject.offsetHeight / 2;
	var inframe = parentObject.offsetLeft + parentObject.offsetWidth < $(getWidgetElementId("innerBox")).outerWidth() / 2;
	if (inframe) {
		left += parentObject.offsetLeft + parentObject.offsetWidth;
        $(getWidgetElementId("tooltipRight")).css('display','none');
        $(getWidgetElementId("tooltipLeft")).css('display','block');
		$(getWidgetElementId("alternativesDiv")).css({"background-image":"url("+widgetRootUrl+"images/lBubble.png)"});
	} else {
		left += parentObject.offsetLeft - $(getWidgetElementId("alternativesDiv")).outerWidth() + ($(getWidgetElementId("alternativesDiv")).outerWidth() - balloonWidthNoTip);
        if (left <= permittedLeftLimit) {left = permittedLeftLimit;}
        $(getWidgetElementId("tooltipLeft")).css('display','none');
        $(getWidgetElementId("tooltipRight")).css('display','block');
		$(getWidgetElementId("alternativesDiv")).css({"background-image":"url("+widgetRootUrl+"images/rBubble.png)"});
	}
	
	$(getWidgetElementId("alternativesDiv")).css("left", left+"px").css("top", top+"px");
}

function addAlternatives(corrections) {
	$("span.alternate").bind("click contextmenu", function(){
		id = this.id.split("_");
		var options = corrections.alternatives[id[1]];
		
		var noOptions = false;
		list = "<table id='GingerWidget-alternativeTable'><tbody>";
		if (options.length <= 0) {
			list += "<tr><td class='altToken'>" + noSuggestionText + "</td></tr>";
			noOptions = true;
		} else {
			for (i = 0; i < options.length; i++) {
				list += "<tr><td class='altToken'>" + options[i].token + "</td><td class='sampleSentence'>" + options[i].sample + "</td></tr>";
			}
		}
		list += "</tbody></table>";
		$(getWidgetElementId("alternativesInnerDiv")).html(list);
		
		if (noOptions) {
			$(getWidgetElementId("alternativeTable")).css("table-layout", "fixed").css("width", "100%").css("text-align", "center");
		}
		
		$(getWidgetElementId("alternativesInnerDiv tr")).mouseover(function(event){
			$(this).children().css("color", "#fff").css("cursor", "pointer").css("background-color", "#2381c2");
		});
		$(getWidgetElementId("alternativesInnerDiv tr")).mouseleave(function(event){
			$(this).children().css("color", "#213643").css("cursor", "auto").css("background-color", "transparent");
		});
		$(getWidgetElementId("alternativesInnerDiv tr")).click(function(event){
			var altText = $(this).find("td.altToken").html();
			if (altText != noSuggestionText) {
				$("span"+getWidgetElementId("alternate_")+id[1]).html(altText);
			}
		});
		
		showHideAlternativesPopup(true);
		repositionToolTip(this);
		
		return false;
	});
}

function parseResponse(data, status) {
	if (!requestInProcess) {
		return;
	}
	
	requestInProcess = false;
	var originalText, correctedText, alternatives;
	if (status != "success") {
		notifyError();
	} else {
		var corrections = getCorrections(data);
		if (corrections) {
			$(getWidgetElementId("originalHtmlText")).html(corrections.original);
			$(getWidgetElementId("correctedText")).html(corrections.correction);
		} else {
			notifyError();
		}
	}
	showSuggestion();
	
	if (!validateReplyLength(corrections && corrections.correction)) {
		$(getWidgetElementId("editOriginalWrapper")).show();
		$(getWidgetElementId("originalHtmlText")).hide();
		$(getWidgetElementId("originalTexInput")).bind("click", clearPrevCorrections);
		$(getWidgetElementId("correctedText")).html(textTooLongError);
		return false;
	}
	
	addAlternatives(corrections);
	addLowConfStyle();
}

function errorHandler(XHR, textStatus, errorThrown) {
	notifyError();
}

function notifyError() {
	$(getWidgetElementId("originalHtmlText")).html(originalSentence);
	$(getWidgetElementId("correctedText")).html(unknownError);
	showSuggestion();
}

function loadExtraStyles(balloonWidthNoTip) {
    var tooltipRight_width = $(getWidgetElementId("tooltipRight")).width();
    var tooltipLeft_width = $(getWidgetElementId("tooltipLeft")).width();
    balloonWidthNoTip = balloonWidthNoTip - tooltipRight_width - tooltipLeft_width;
    if(balloonWidthNoTip > 330) {balloonWidthNoTip = 330}
    
	$(getWidgetElementId("outerBox")).css("height", "90px").css("background", "url("+widgetRootUrl+"images/grayBG.png)");
	$(getWidgetElementId("separator")).css("display", "block").css("margin", "16px 0 15px").css("width", "100%").css("height", "1px").css("background", "url("+widgetRootUrl+"images/dotLine.gif) no-repeat");
	$(".originalText").css("background", "url("+widgetRootUrl+"images/inputTop.png) repeat-x");
	$("div.correctionText").css("background-image", "url("+widgetRootUrl+"images/inputBottom.png)");	
	$(getWidgetElementId("alternativesDiv")).css("background", "url("+widgetRootUrl+"images/lBubble.png) no-repeat").css("width", balloonWidthNoTip).css("height", "76px").css("position", "absolute").css("visibility", "hidden").css("z-index", "1");
	$(getWidgetElementId("submitButton")).css("background", "url("+widgetRootUrl+"images/correctButton.png) no-repeat left top");
	$(getWidgetElementId("vFooterImg")).attr("src", widgetRootUrl+"images/v.png");
	$(getWidgetElementId("getItNowImg")).attr("src", widgetRootUrl+"images/getItNow.gif");
    $(getWidgetElementId("corner-right")).css("background", "url("+widgetRootUrl+"images/grayBG-r.png) no-repeat");
    $(getWidgetElementId("corner-left")).css("background", "url("+widgetRootUrl+"images/grayBG-l.png) no-repeat");
    $(".GingerWidget-leftCorner").css("background", "url("+widgetRootUrl+"images/inputTop-left.png) no-repeat");
    $(getWidgetElementId("originalHtmlText")).css("background", "url("+widgetRootUrl+"images/inputBottom.png) no-repeat");
    $(getWidgetElementId("tooltipRight")).css("background", "url("+widgetRootUrl+"images/bg-tooltipRight.png) no-repeat");
    $(getWidgetElementId("tooltipLeft")).css("background", "url("+widgetRootUrl+"images/bg-tooltipLeft.png) no-repeat");
    
}

function fitWidgetToIframeSize() {
    adjustIframeWidth();
    
    var innerBox_width = $(getWidgetElementId("innerBox")).width();
    var editOriginalWrapper_width = $(getWidgetElementId("editOriginalWrapper")).width();
    var submitButton_width = $(getWidgetElementId("submitButton")).width();
    var originalTexInput_width = editOriginalWrapper_width - submitButton_width;
    
	$(getWidgetElementId("originalTexInput")).css("width", originalTexInput_width + 'px');
    $(getWidgetElementId("footer")).css("width", innerBox_width + 'px');
    if ($.browser.msie && jQuery.browser.version < 8) {
        $(getWidgetElementId("originalTexInput")).css({"width":editOriginalWrapper_width, "margin-top":"-1px"});
    }
}

function adjustIframeWidth() {
    var iframe_width = $('body').width();
    var iframe_max_width = 728;
    var iframe_min_width = 420;
    var iframe_no_link_width = 590;
    
    if (iframe_width > iframe_max_width) {
        $('body').css('width', iframe_max_width);
    }
    else if (iframe_width < iframe_min_width) {
        $('body').css('width', iframe_min_width);
    }
    if (iframe_width < iframe_no_link_width) {
        $(getWidgetElementId("footerLink")).css('display', 'none');
    }
}

function addLowConfStyle() {
	$("span.alternate.low").css("background", "url("+widgetRootUrl+"images/questionMark.gif) no-repeat scroll right center transparent").css("padding", "0 13px 0 0");
}

function gup(name) {
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp(regexS);
	var results = regex.exec(window.location.href);
	if (results == null) return "";
	else return results[1];
}

function replaceBuyNowUrl() {
	var buyNowUrl = gup('buyNowUrl');
	if (buyNowUrl && buyNowUrl != undefined) {
		var url = unescape(buyNowUrl);
		if (!/^http:\/\/(.)*/.test(url)) {
			url = "http://"+url;
		}
		
		$(getWidgetElementId("footer a")).attr("href", url);
	}
}


$(document).ready(function(){
    var balloonWidthNoTip = $(getWidgetElementId('innerBox')).width() / 2;
	loadExtraStyles(balloonWidthNoTip);
	replaceBuyNowUrl();
    fitWidgetToIframeSize();

	$(getWidgetElementId("originalTexInput")).val(initialMsg);
	$(getWidgetElementId("editOriginalWrapper")).bind("click", clearInitialMsg);
	$(getWidgetElementId("originalHtmlText")).bind("click", clearPrevCorrections);
	$(getWidgetElementId("submitButton")).hover(
        function(){
            $(this).css('background-position', 'left bottom'); 
        },
        function(){
            $(this).css('background-position', 'left top'); 
        }
    );
    
	$("body").bind("click", function() {
		showHideAlternativesPopup(false);
	});
	
	$("form"+getWidgetElementId("gingeration-correction-form")).submit(function(){
		if (requestInProcess) {
			return false;
		}
		
		if (!validateInput()) {
            displayInputErrorMsg();
            return false;
        }
        
		requestInProcess = true;
		originalSentence = removeLeadingSpaces($(getWidgetElementId("originalTexInput")).val());
		
		showProgress();
		clearSuggestionField();
		
		$(function(){
		    var jsonFeed = webiteRootUrl+"sites/all/modules/gingeration/correcttext.php";
			$.jsonp({
		        url: jsonFeed,
		        data: { "text" : originalSentence,  "source": "distributable widget", "callbackFunc" : "parseResponse" },
		        dataType: "jsonp",
		        callbackParameter: "jsoncallback",
				callback: "parseResponse",
		        timeout: 30000,
				success: parseResponse,
		        error: errorHandler
		    });
		});
		return false;
    });
    
    $(getWidgetElementId("originalTexInput")).keypress(function(event){
        $(getWidgetElementId("checkWidth")).html($(this).val());
        var input_left_padding = 8;
        var new_input_text = $(this).val();
        var max_length = $(getWidgetElementId("originalTexInput")).width() - input_left_padding;
        var text_width = $(getWidgetElementId("checkWidth")).width();
        if (text_width >= max_length && event.charCode != 0) {
           event.preventDefault();
        }
    });
    
    $(getWidgetElementId("submitButton")).click(function(event) {
        $(getWidgetElementId("checkWidth")).html($(getWidgetElementId("originalTexInput")).val());
        var input_left_padding = 8;
        var max_length = $(getWidgetElementId("originalTexInput")).width() - input_left_padding;
        var text_width = $(getWidgetElementId("checkWidth")).width();
        while(text_width >= max_length) {
            var the_text = $(getWidgetElementId("originalTexInput")).val();
            var text_length = the_text.length;
            var trimmed_text = the_text.substr(0, text_length - 1);
            
            $(getWidgetElementId("originalTexInput")).val(trimmed_text);
            $(getWidgetElementId("checkWidth")).html(trimmed_text);
            text_width = $(getWidgetElementId("checkWidth")).width();
        }
    });

});
