/**
 * Website Grader Client Side Library
 * @author Mawi
 */
(function($){

    var messageMachine = {
        messages: ['A Message!', 'Another message!'],
		panel:null,
        init: function(hostDomain){
             panel = new YAHOO.widget.Panel("progress-panel", {
                width: '300px',
				height:'200px',
                zindex: 1011,
                visible: false,
                constraintoviewport: true,
                draggable: false,
                modal: true,
                underlay: "shadow",
                close: false,
                fixedcenter: true
            });
            panel.render();
			panel.show();
            $.ajax({
                type: 'GET',
                url: hostDomain + 'waitingmessages',
                dataType: 'json',
                success: function(data){
                    var messages = data.messages;
                    setInterval(function(){
                        var message = messages.shift();
						$("#waiting-message").html(message);
                        messages.push(message);
                    }, 3000);
                },
                data: {},
                asynch: false
            });
        },
        hide: function(delayed){
            panel.hide();
        }
    }
    
    var grader = window.grader = window.grader ||
    {}, wsg = grader.wsg = grader.wsg ||
    {}, generator = wsg.reportGenerator = wsg.reportGenerator ||
    {};
    
    generator.urlContainer = "";
    generator.competitorsContainer = "";
    generator.userEmailContainer = "";
    generator.optInContainer = "";
    generator.userToken = "";
    generator.portalId = "";
    generator.trackerId = "";
    generator.ipAddress = "";
    generator.affiliateId = "";
    generator.extCustomerId = "";
    generator.reportContainer = "";
    generator.progressContainer = "";
    
    generator.finishCallback = null;
    generator.callBackUrl = "";
    generator.progressHandlerId = null;
    generator.checkProgressInterval = 2000;
    generator.triggerObject = "";
    generator.startingMessage = "";
    generator.inProgress = false;
    generator.inActiveAjaxCall = false;
    generator.disableInlineReports = false;
    generator.hostDomain = "http://websitegrader.com";
    generator.reportGenerated = false;
    generator.reportKey = ""
    
    generator.init = function(urlContainer, competitorsContainer, userEmailContainer, optInContainer, ipAddress, affiliateId, extCustomerId, reportContainer, progressContainer, callBackUrl, disableInlineReports, hostDomain){
        generator.urlContainer = urlContainer;
        generator.competitorsContainer = competitorsContainer;
        generator.userEmailContainer = userEmailContainer;
        generator.optInContainer = optInContainer;
        generator.ipAddress = ipAddress;
        generator.affiliateId = affiliateId;
        generator.extCustomerId = extCustomerId;
        generator.reportContainer = reportContainer;
        generator.progressContainer = progressContainer;
        generator.callBackUrl = callBackUrl;
        generator.disableInlineReports = disableInlineReports;
        generator.hostDomain = hostDomain;
        $.ajaxSetup({
            timeout: 30000
        });
        $(document).ajaxError(function(event, request, settings, thrownError){
            generator.inActiveAjaxCall = false;
            generator.errored("Sorry WebsiteGrader is very busy right now, please try again later");
            logSafely("Ajax call failed");
            logSafely("Request: " + request);
            logSafely("Event: " + event);
            logSafely("Error: " + thrownError);
            logSafely("Settings: " + settings.url);
            generator.notifyUIError("An ajax call timed-out or failed internally, url : " + settings.url);
            generator.callFinishCallBack();
            messageMachine.hide();
        });
        
        $(document).ajaxStart(function(){
            generator.inActiveAjaxCall = true;
        });
        $(document).ajaxComplete(function(){
            generator.inActiveAjaxCall = false;
        });
    }
    
    generator.start = function(portalId, finishCallback){
    
    
        if (generator.inActiveAjaxCall) {
            logSafely("generator.inActiveAjaxCall");
            generator.callFinishCallBack();
            return;
        }
        if (generator.inProgress) {
            logSafely("generator.inProgress");
            generator.callFinishCallBack();
            return;
        }
        var currentUserToken = ReadCookie('hubspotutk');
        if (currentUserToken == '' || currentUserToken == 'undefined') {
        
            currentUserToken = "";
            for (var i = 0; i < 32; i++) {
                currentUserToken += Math.floor(Math.random() * 0xF).toString(0xF);
            }
        }
        
        generator.userToken = currentUserToken;
        generator.trackerId = null;
        generator.portalId = portalId;
        generator.finishCallback = finishCallback;
        
        var competitorsValue = $(generator.competitorsContainer).val();
        var StrToCheck = competitorsValue.replace(/^\s+|\s+$/, '');
        var CompetitorsArray = StrToCheck.split(/[;,\n]+/);
        var all = CompetitorsArray.length;
        var competitorsString = "";
        if (CompetitorsArray.length > 0) {
            for (i = 0; i < CompetitorsArray.length; i++) {
                var url = CompetitorsArray[i];
                url = url.replace(/^\s+|\s+$/, '');
                if (url.length == 0) {
                    continue;
                }
                if (i != CompetitorsArray.length - 1) {
                    competitorsString += url + ",";
                }
                else {
                    competitorsString += url;
                }
            }
        }
        generator.reportGenerated = false;
        generator.reportKey = ""
        var postedData = {
            url: $(generator.urlContainer).val(),
            competitors: competitorsString,
            email: $(generator.userEmailContainer).val(),
            userToken: generator.userToken,
            portalId: generator.portalId,
            optIn: document.getElementById("optIn").checked,
            ipAddress: generator.ipAddress,
            affiliateId: generator.affiliateId,
            extCustomerId: generator.extCustomerId
        };
        
        generator.started();
        generator.showProgressPopUp();
        
        ajaxUrl = generator.callBackUrl + "report/";
        $.post(ajaxUrl, postedData, function(data){
        
            if (generator.validResponse(data)) {
                if (data == null || data.Error != null) {
                    generator.errored(data.Error);
                    var notifyError = data.Error;
                    if (data.ApiUrl != null) {
                        notifyError += " " + data.ApiUrl;
                    }
                    generator.notifyUIError(notifyError);
                    messageMachine.hide();
                    generator.callFinishCallBack();
                }
                else 
                    if (data.TrackerId != null && data.TrackerId != '') {
                        generator.trackerId = data.TrackerId;
                        generator.progressHandlerId = window.setInterval(generator.progress, generator.checkProgressInterval);
                    }
                    else {
                        generator.errored("Sorry..Unexpected error happened, please try again later.");
                        messageMachine.hide();
                        generator.notifyUIError("Did not find report tracker Id on the server response");
                        generator.callFinishCallBack();
                    }
            }
        }, "json");
        
    }
    
    generator.progress = function(){
        if (generator.inActiveAjaxCall) {
            return;
        }
        
        var postedData = {
            trackerId: generator.trackerId
        };
        ajaxUrl = generator.callBackUrl + "progress/";
        $.post(ajaxUrl, postedData, function(data){
        
            if (!generator.validResponse(data)) {
                generator.errored("Sorry..Unexpected error happened, please try again later.");
                generator.notifyUIError(ajaxUrl + " : Returned Invalid Output");
                generator.callFinishCallBack();
            }
            else {
                if (data.Error != null) {
                    generator.errored(data.Error);
                    var notifyError = data.Error;
                    if (data.ApiUrl != null) {
                        notifyError += " " + data.ApiUrl;
                    }
                    generator.notifyUIError(notifyError);
                    messageMachine.hide();
                    generator.callFinishCallBack();
                }
                else 
                    if (data.Progress != null) {
                        generator.formatProgress(data.Progress, false);
                    }
                    else 
                        if (data.Success != null) {
                            generator.formatProgress("Displaying Report...", false);
                            generator.finished(false);
                            generator.fetchReport(data.Success);
                        }
                        else {
                            generator.errored("Sorry..Unexpected error happened, please try again later.");
                            generator.notifyUIError(ajaxUrl + " : Returned Invalid Output");
                            messageMachine.hide();
                            generator.callFinishCallBack();
                        }
            }
        }, "json");
    };
    
    generator.fetchReport = function(reportToFetchkey){
        var postedData = {
            reportKey: reportToFetchkey
        };
        ajaxUrl = generator.callBackUrl + "fetchReport/";
        if (generator.disableInlineReports) {
            window.location.href = generator.hostDomain + "site/" + $(generator.urlContainer).val().replace(/http:\/\//, '').replace(/https:\/\//, '');
        }
        else {
            $.post(ajaxUrl, postedData, function(data){
                generator.finished(true);
                $(generator.reportContainer).html(data);
            }, "html");
        }
    };
    
    generator.validResponse = function(data){
        return (data != null);
    };
    
    generator.started = function(){
        var starting = "Initializing...";
        if (generator.startingMessage != null && generator.startingMessage != "") {
            starting = generator.startingMessage;
        }
        generator.formatProgress(starting, true);
        generator.inProgress = true;
        $(generator.reportContainer).html('');
        $(generator.progressContainer).hide();
    };
    
    generator.errored = function(errorText){
        window.clearInterval(generator.progressHandlerId);
        generator.inProgress = false;
        logSafely("Error Text:" + errorText);
        if (errorText == "Did not find report tracker" || errorText.match(/Failed to call JWSG API/)) {
            $(generator.progressContainer).text("Sorry WebsiteGrader is very busy right now, please try again later");
        }
        else {
            $(generator.progressContainer).text(errorText);
        }
        $(generator.progressContainer).removeClass();
        $(generator.progressContainer).addClass("messageAlert");
        $(generator.progressContainer).show();
        messageMachine.hide();
    };
    
    generator.finished = function(noMoreProgress){
        window.clearInterval(generator.progressHandlerId);
        if (noMoreProgress) {
            generator.inProgress = false;
            $(generator.progressContainer).removeClass();
            $(generator.progressContainer).addClass("message correct");
            $(generator.progressContainer).fadeOut(1000);
            generator.callFinishCallBack();
            messageMachine.hide();
        }
    };
    
    generator.formatProgress = function(progress, show){
        if (!generator.inProgress) {
            var progressTemplate = "<table><tr><td valign='top' align='left'><img src='http://www.websitegrader.com/assets/images/hubspot_load5.gif'></td><td valign='center' align='left' id='progTextHolder'>" + progress + "</td></tr></table>";
            $(generator.progressContainer).html(progressTemplate);
        }
        else {
            $("#progTextHolder").html(progress);
        }
        if (show) {
            $(generator.progressContainer).removeClass();
            //$(generator.progressContainer).fadeIn();
        }
        $(generator.reportContainer).hide();
    };
    
	generator.progressMsgHtml=function(progress){
		 return "<table><tr><td valign='top' align='left'><img src='http://www.websitegrader.com/assets/images/hubspot_load5.gif'></td><td valign='center' align='left' id='progTextHolder'>" + progress + "</td></tr></table>";
           
	}
    generator.callFinishCallBack = function(){
        if (generator.finishCallback != null) {
            generator.finishCallback();
        }
    };
    
    generator.showForm = function(){
        $("#collapsibleForm").show();
    };
    
    generator.hideForm = function(){
        $("#collapsibleForm").hide();
    };
    
    generator.notifyUIError = function(error){
        if (window.grader.notifier == null) {
            return;
        }
        var input = "[host=" + generator.hostDomain + "Url=" + $(generator.urlContainer).val() + ",Competitors=" + $(generator.competitorsContainer).val() + ",Email=" + $(generator.userEmailContainer).val() + ",ip=" + generator.ipAddress + "]";
        var errorData = "appId=wsg&inputs=" + escape(input) + "&errors=" + escape(error);
        window.grader.notifier.emailer.notify(errorData);
    };
    
    generator.showProgressPopUp = function(){
		 messageMachine.init(generator.hostDomain);
    }
    
})(jQuery);

