﻿//Initialise Classes
var validation = new validationClass();
var AjaxPostGet = new AjaxPostGetClass();
var login = new LoginClass();
var SignUp = new SignUpClass();
var MyAccount = new MyAccountClass();
var Campaign = new CampaignClass();
var Reports = new ReportsClass();

//PUBLIC DECLERATIONS

//AJAX ENUM
var ajaxErrorEnum = {"ServerError": 1};

//VALIDATION ENUM
var validationResultEnum = {"required":1,
                        "textOnly":2,
                        "numberOnly":3,
                        "email":4,
                        "minNumber":5,
                        "maxNumber":6,
                        "equalTo":7};

//LOGIN ENUM
var LoginAccountStateEnum = {"affiliateAccountSetToClosed": -1,
                                "affiliateAccountSetToOpen": -2,
                                "armLockedTheAccount": -3,
                                "lockedDueToBruteForceAttack": -4,
                                "affiliateLoginPasswordMissMatch": -5,
                                "ProblemResttingPassword": 6};

//SIGNUP ENUM
var signUpEnum = {"SignUpSuccessful": 1,
                  "SignUpUnsuccessful": 2};
                  
//SESSION ENUM
var SessionEnum = {"SessionTimeOut": 0};


///AJAX CLASS//////
function AjaxPostGetClass(){
    
    var event = undefined;
              
    this.ajaxSuccess = function(data, textStatus){
        event(data, textStatus);
    
    }
    
    this.ajaxError = function(){
        event(ajaxErrorEnum.ServerError);
    
    }
         
    this.post = function(url, dataFields, callBackFunction){

    event = callBackFunction;       
    var fields = undefined;
    
        $.ajax({
                type: "POST", 
                url: url, 
                dataType:"json",
                data: function(){ 
                                    fields = $("#"+dataFields).serializeArray();
                                    jQuery.each(fields, function(i, field){if($("#" + field.name).attr("type")==="checkbox")
                                                                                field.value = field.value === "on" ? true : false;});
                                    return fields;}(),

                timeout: 30000,
                error: AjaxPostGet.ajaxError,
                success: AjaxPostGet.ajaxSuccess
                });    
    }
    
    this.get = function(url, dataFields, callBackFunction){
    
        var fields = undefined;
        event = callBackFunction;
        
        $.ajax({    type: "GET", 
                        url: url, 
                        dataType: "json",
                        data: function(){ 
                                    fields = $("#"+dataFields).serializeArray();
                                    jQuery.each(fields, function(i, field){if($("#" + field.name).attr("type")==="checkbox")
                                                                                field.value = field.value === "on" ? true : false;});
                                    return fields;}(),
                        timeout: 30000,
                        error: AjaxPostGet.ajaxError,
                        success: AjaxPostGet.ajaxSuccess});          
    }
    
    this.getHTML = function(url, dataFields, callBackFunction){
    
        var fields = undefined;
        event = callBackFunction;
        
        $.ajax({    type: "GET", 
                        url: url, 
                        dataType: "html",
                        data: function(){ 
                                    fields = $("#"+dataFields).serializeArray();
                                    jQuery.each(fields, function(i, field){if($("#" + field.name).attr("type")==="checkbox")
                                                                                field.value = field.value === "on" ? true : false;});
                                    return fields;}(),
                        timeout: 30000,
                        error: AjaxPostGet.ajaxError,
                        success: AjaxPostGet.ajaxSuccess});          
    }
    
    this.GetSpecificParameters = function(url, parameters, data, callBackFunction){
    
        var fields = undefined;
        event = callBackFunction;
        
        $.ajax({    type: "GET", 
                        url: url, 
                        dataType: "json",
                        data: parameters + "=" + data,
                        timeout: 30000,
                        error: AjaxPostGet.ajaxError,
                        success: AjaxPostGet.ajaxSuccess});          
    }
}
////////VALIDATION CLASS////////////

function validationClass(){

    this.valid = undefined;
    this.validationError = new Array();
        
    this.Rquired = function(field){
       return field.length > 0 ? true : false;
    }
    
    this.TextOnly = function(field){
        var regEx = /^[a-zA-Z ]+$/i;
        return regEx.test(field); 
    }
    
    this.NumericOnly = function(field){
        var regEx = /^[0-9]+$/i;
        return regEx.test(field);
    }
    
    this.Email = function(field){        
       var regEx = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/i;
       return regEx.test(field);   
    }
    
    this.MinLength = function(field, minLength){
       return field.length <= minLength ? true : false;
    }
    
    this.MaxLength = function(field, maxLength){
       return field.length >= maxLength ? true : false;
    }
    
    this.LengthEqualTo = function(field, lengthEqualTo){
        return field.length === lengthEqualTo ? true:false;
    }
    
    this.ValidateFields = function(callClass, control, required, textOnly, numericOnly, email, minLength, maxLength, LengthEqualTo){
        if(this.valid === true){
           var field = $("#"+control).val();
           
           var validationError = new Array();
           
                if(required){
                    if(validation.Rquired(field) === false){
                        this.valid = false;
                        required = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.required);
                        
                    }
                }
                if((textOnly) && (required)) {
                    if(validation.TextOnly(field) === false){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.textOnly);
                    }
                }  
                if((numericOnly) && (required)){
                    if(!validation.NumericOnly(field)===false){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.numberOnly);
                    }
                }    
                if((email) && (required)){
                    if(validation.Email(field)===false){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.email);
                    }
                }  
                if((minLength) && (required)){
                    if(!validation.MinLength(field, minLength)===false){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.minNumber);;
                    }
                } 
                if((maxLength) && (required)){
                    if(!validation.MaxLength(field, maxLength)===false){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.maxNumber);
                    }
                } 
                if((LengthEqualTo) && (required)){
                    if(!validation.LengthEqualTo(field, LengthEqualTo)){
                        this.valid = false;
                        this.validationError.length = this.validationError.push(validationResultEnum.equalTo);
                    }
                } 
                
                if(this.valid===false){
                    callClass(this.validationError, control);
                    this.validationError = new Array();
                }
            }
         }
    
    this.FieldsEqual = function(callClass, formControl, field1, field2){
        
        if(this.valid){
            field1 = $("#" + field1).val();
            field2 = $("#" + field2).val();
            if(field1 != field2){
                this.valid = false;
                this.validationError.length = this.validationError.push(validationResultEnum.textOnly)
                callClass(this.validationError, formControl);
            }
        }   
    }      
}

//LOGIN CLASS/////
function LoginClass() {

    var data = undefined;
    var fields = new Array()
        
    this.AjaxRequestPasswordResponse = function(data, textStatus){
       affiliateLoginUi.AjaxRequestPasswordResponse(data, textStatus);
    }
    
    this.AjaxResetPasswordResponse = function(data, textStatus){
        affiliateLoginUi.AjaxResetPasswordResponse(data, textStatus);
    }
    
    this.AjaxLoginResult = function(data, textStatus){
        affiliateLoginUi.AjaxLoginResult(data, textStatus);
    }
    
    this.LogUserIn = function(form){
        AjaxPostGet.post("/login/action/ajax/", form, login.AjaxLoginResult); 
    }
    
    this.requestFogottenPassword = function(form){
        AjaxPostGet.post("/login/passwordreset/", form, login.AjaxRequestPasswordResponse);
    }
    
    this.ResetPassword = function(form){
        AjaxPostGet.post("/login/resetpasswordconfirmed/", form, login.AjaxResetPasswordResponse);
    }
}

// ********************** SIGN UP *********************

function SignUpClass(){
        
    this.AjaxSignUpAffiliateResponse = function(data, textStatus){
        affiliateSignUpUi.AjaxSignUpAffiliateResponse(data, textStatus);
    }

    this.SignUpAffiliate = function(form){
        AjaxPostGet.post("/signup/action/", form, SignUp.AjaxSignUpAffiliateResponse);    
    }
}

// ********************** campaigns *********************
//
function CampaignClass(){

    this.AjaxAddCampaignResponse = function(data, textStatus){
        affiliateCampaignUI.AjaxAddCampaignResponse(data, textStatus);
    }
    
    this.AjaxGetCampaignResponse = function(data, textStatus){
        affiliateCampaignUI.AjaxGetCampaignResponse(data, textStatus);
    }
   
    this.RetrieveCampaigns = function(){
        AjaxPostGet.get("/campaigns/", null, Campaign.AjaxGetCampaignResponse);
    }
    
    this.CreateCampaign = function(form){
        AjaxPostGet.post("/campaigns/action/",form, Campaign.AjaxAddCampaignResponse);
    }
    this.AjaxCampaignDetail = function(url, functionName) {
        AjaxPostGet.get(url, null, functionName);
        
    }
}


// ********************** reports **********************
// 
function ReportsClass(){
    
    this.AjaxGerReportResponse = function(data, textStatus){
        AffiliateReportsUI.AjaxReportResponse(data, textStatus);
    }

    this.AjaxExportReportResponse = function(data, textStatus){
        AffiliateReportsUI.AjaxExportReportResponse(data, textStatus);
    }

    this.GetReport = function(form) {   
        AjaxPostGet.getHTML("/reports/action/", form, Reports.AjaxGerReportResponse);
    }

    this.ExportReport = function(form){
        AjaxPostGet.getHTML("/reports/export/",form, Reports.AjaxExportReportResponse);    
    }
}

// ********************** my account *********************

function MyAccountClass(){  
    
    this.AjaxAccountResponse = function(data, textStatus){
        affiliateAccountUI.AjaxResponse(data,textStatus); 
    } 
    
    this.UpdateAffiliatePaymentDetails = function(form, paymentType){
      
        switch ($("#selectPaymentType option:selected").val())
        {   
            case "Check":{
                AjaxPostGet.post("/account/updatepaymentcheck/", form, MyAccount.AjaxAccountResponse);   
                break;
            }

            case "Click2Pay":{                                
                AjaxPostGet.post("/account/updatepaymentclick2pay/", form, MyAccount.AjaxAccountResponse);
                break;
            }
            
            case "EcoCard":{   
                AjaxPostGet.post("/account/updatepaymentecocard/", form, MyAccount.AjaxAccountResponse);
                break;
            }
            
            case "Neteller":{
                AjaxPostGet.post("/account/updatepaymentneteller/", form, MyAccount.AjaxAccountResponse);    
                break;
            }
            case "Payspark":{          
                AjaxPostGet.post("/account/updatepaymentpayspark/", form, MyAccount.AjaxAccountResponse);
                break;
            }
            case "Moneybookers":{
                AjaxPostGet.post("/account/updatepaymentMoneybookers/", form, MyAccount.AjaxAccountResponse);    
                break;
            }
            case "WireTransfer":{
                AjaxPostGet.post("/account/updatepaymentwiretransfer/", form, MyAccount.AjaxAccountResponse);
                break;
            }
        }                                     
    }
    
    this.UpdateAffiliateContactDetails = function(form){ 
        AjaxPostGet.post("/account/update/", form, MyAccount.AjaxAccountResponse);
    }  
}