﻿/*
Verilen objelerin validasyon kontollerini yapar. 
Örnek:
function control(){
    var validation = new Validation();
    validation.add(new ValidationObject('txtName', validation.typeTextBox, validation.validationTypeReqFieldVal, 'isim', 'İsim alanı boş olamaz'));
    validation.add(new ValidationObject('txtSurname', validation.typeTextBox, validation.validationTypeReqFieldVal, 'soyad', 'Soyad alanı boş olamaz'));
    validation.add(new ValidationObject('txtCompanyName', validation.typeTextBox, validation.validationTypeReqFieldVal, 'şirket ismi', 'Şirket ismi alanı boş olamaz'));
    validation.add(new ValidationObject('ddlPositions', validation.typeDropDownList, validation.validationTypeReqFieldVal, '', 'Lütfen bir pozisyon seçin'));
    validation.add(new ValidationObject('txtEmail', validation.typeTextBox, validation.validationTypeReqFieldVal, 'e-posta', 'E-posta alanı boş olamaz'));
    validation.add(new ValidationObject('txtEmail', validation.typeTextBox, validation.validationTypeEmailVal, 'e-posta', 'Lütfen geçerli bir e-posta adresi girin'));
    
    var bool = validation.validate();
    if(!bool)validation.alertErrorMessages();

    return bool;
}

Tek bir obje içinde aşağıdaki fonksiyon direkt olarak çalıştırılabilir.
Örnek:
function control2(){
    var validation = new Validation();
    var textBox = document.getElementById("Text1");
    
    var bool = validation.requestFieldValidation(textBox, validation.typeTextBox, 'dd');
    
    alert(bool);
}
*/

//Validasyon objesinin balangıç fonksiyonu.
//-----------------------------------------------------------------------------------------
function Validation(){
    this.typeTextBox = "textbox";
    this.typeDropDownList = "dropDownList";
    this.typeCheckBox = "checkBox";
    this.typeRadioButtonList = "radioButtonList";
    
    this.validationTypeReqFieldVal = "RequiredFieldValidation";
    this.validationTypeEmailVal = "EmailValidation";
    this.validationTypeUrlVal = "UrlValidation";
    this.validationTypeOnlyTextAndSpaceVal = "OnlyTextAndSpaceValidation";
    this.validationTypeOnlyNumberVal = "OnlyNumberValidation";
    this.validationTypeOnlyTextAndSpaceAndNumberVal = "OnlyTextAndSpaceAndNumberValidation";
    this.validationTypeOnlyTextAndSpaceAndNumberAndPunctuationVal = "OnlyTextAndSpaceAndNumberAndPunctuationValidation";
    
    this.objectArray = new Array();
    this.pageIsValid = true;
    this.errorMessageArray = new Array();
    //this.errorText = '--Hata:\r\n';
    this.errorText = '';
}

//Arraya eklenecek objeleri alacak fonksiyon.
function ValidationObject(_objectId, _objectType, _validationType, _initialValue, _errorMessage){
    this.objectId = _objectId;
    this.object = null;
    if(document.getElementById(_objectId))this.object = document.getElementById(_objectId);
    //this.objectId = document.getElementById(_objectId);
    this.objectType = _objectType;
    this.validationType = _validationType;
    this.initialValue = _initialValue;
    this.errorMessage = _errorMessage;
    this.isValid = true;
    this.validationType
}

Validation.prototype.RegexTest = function(text, expression, errorMessage){
    //text = text.trim();
    
    var ok = true;
    if (!expression.test(text)){
        this.errorMessageArray.push(errorMessage); 
        this.pageIsValid = false;
        ok = false;
        //return false;
    }

    return ok;
}

//Verilen objenin kontrolü yapılır.
Validation.prototype.requiredFieldValidation = function (object, objectType, initialValue, errorMessage){
    var ok = true;
    
    if(objectType == this.typeTextBox){
        object.value = Trim(object.value);
        
       if(object.value.length == 0 || object.value == initialValue){
            this.pageIsValid = false;
            this.errorMessageArray.push(errorMessage);
            ok = false;
        } 
    }
    else if(objectType == this.typeCheckBox){
        if(!object.checked){
            this.pageIsValid = false;
            this.errorMessageArray.push(errorMessage);
            ok = false;
        }
    }
    else if(objectType == this.typeRadioButtonList){
        var checkedCount = 0;
        for (var i = 0; i < object.length; i++) {
          if (object[i].checked) {
            checkedCount = checkedCount + 1;
          }
        }
        
        if(checkedCount == 0){
            this.pageIsValid = false;
            this.errorMessageArray.push(errorMessage);
            ok = false;
        }
    }
    else if(objectType == this.typeDropDownList){
        if(object.length == 0){
            this.pageIsValid = false;
            this.errorMessageArray.push(errorMessage);
            ok = false;
            //return false;
        }
        else{
            if(object.selectedIndex == -1){
                this.pageIsValid = false;
                this.errorMessageArray.push(errorMessage);
                ok = false;
                //return false;
            }
            else{
                if(object.options[object.selectedIndex].value == initialValue){
                    this.pageIsValid = false;
                    this.errorMessageArray.push(errorMessage);
                    ok = false;
                    //return false;
                }
            }
        }
    }
    
    return ok;//true;
};

//Email kontrolü
Validation.prototype.emailValidation = function(object, errorMessage){
    var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return this.RegexTest(object.value, filter, errorMessage);
}

//Url kontrolü
Validation.prototype.urlValidation = function(object, errorMessage){
    //var filter = /\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]/i;
    //var filter = /\b(https?|ftp|file):\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#\/%=~_|]/;
    url = object.value;
    url = url.replace(/^(ftp:\/\/)/img, "");
    if (!url.match(/^(http:\/\/|https:\/\/)/im)){
        url = 'http://' + url;
        object.value = url;
    }
    var filter = /(?:http:\/\/|https:\/\/)(?:[\w0-9.]+)(?:[-A-Z0-9+&@#\/%=~_|!:,.;?]*)/;
    return this.RegexTest(object.value, filter, errorMessage);
}

//Sadece text ve boşluk
Validation.prototype.OnlyTextAndSpaceVal = function(object, errorMessage){
    var filter  = /^[a-zA-ZğĞçÇşŞüÜıIöÖğĞçÇşŞüÜıöÖİ ]*$/;
    return this.RegexTest(object.value, filter, errorMessage);
}

//Sadece sayı
Validation.prototype.OnlyNumberVal = function(object, errorMessage){
    var filter  = /^[0-9]*$/;
    return this.RegexTest(object.value, filter, errorMessage);
}

//Sadece text, boşluk ve sayı
Validation.prototype.OnlyTextAndSpaceAndNumberVal = function(object, errorMessage){
    var filter  = /^[a-zA-ZğĞçÇşŞüÜıöÖİ0-9 ]*$/;
    return this.RegexTest(object.value, filter, errorMessage);
}

//Sadece text, boşluk, sayı ve bazı karakterler
Validation.prototype.OnlyTextAndSpaceAndNumberAndPunctuationVal = function(object, errorMessage){
    //var filter  = /^[a-zA-ZğĞçÇşŞüÜıöÖİ0-9 .,_:!=#?@+&%\*\r\n()'"]*$/;
    var filter  = /^[^<>]*$/;
    return this.RegexTest(object.value, filter, errorMessage);
    //return true;
}

//Kontrolü yapılacak objeler eklenir.
Validation.prototype.add = function(validationObject){    
    this.objectArray.push(validationObject);
};

//Eklenen objeleri siler
Validation.prototype.clear = function(){    
    this.objectArray = new Array();
};

//Bu fonksiyon ile array'a atılmış tüm objeler kontrol edilir.
Validation.prototype.validate = function(){
    var bool;
    
    for(i=0; i<this.objectArray.length; i++){
        validationObject = this.objectArray[i];
        
        if(validationObject.validationType == this.validationTypeReqFieldVal){
            if(validationObject.objectType == this.typeRadioButtonList){
                validationObject.object = document.getElementsByName(validationObject.objectId);
            }
            
            bool = this.requiredFieldValidation(validationObject.object, validationObject.objectType, 
                                    validationObject.initialValue, validationObject.errorMessage);
                validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeEmailVal){
            bool = this.emailValidation(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeUrlVal){
            bool = this.urlValidation(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeOnlyTextAndSpaceVal){
            bool = this.OnlyTextAndSpaceVal(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeOnlyNumberVal){
            bool = this.OnlyNumberVal(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeOnlyTextAndSpaceAndNumberVal){
            bool = this.OnlyTextAndSpaceAndNumberVal(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }
        else if(validationObject.validationType == this.validationTypeOnlyTextAndSpaceAndNumberAndPunctuationVal){
            bool = this.OnlyTextAndSpaceAndNumberAndPunctuationVal(validationObject.object, validationObject.errorMessage);
            validationObject.isValid = bool;
        }

        /*if(!bool){
            return false;
        }*/
    }

    return this.errorMessageArray.length > 0 ? false : true;//true;
};

//Klavyeye her basışta basılan karakterin sayı mı olduğunu kontrol eder.
Validation.prototype.onKeyPressCheckNumber = function(e){
    var key;
    var keychar;

    if (window.event)
       key = window.event.keyCode;
    else if (e)
       key = e.which;
    else
       return true;
    
    //Backspace
    if(key == 8)return true;
    
    keychar = String.fromCharCode(key);

    var txt = new Object();
    txt.value = keychar;
       
    var validation = new Validation();
    var bool = validation.OnlyNumberVal(txt, '');

    if(!bool)return false;
};

//Eklenen hata mesajlarını gösterir.
Validation.prototype.alertErrorMessages = function(){
    /*var text = '--Hata:\r\n';
    
    for(i=0; i<this.errorMessageArray.length; i++){
        text += this.errorMessageArray[i] + '\r\n';
    }
    
    alert(text);*/
    for(i=0; i<this.errorMessageArray.length; i++){
        this.errorText += this.errorMessageArray[i] + '|';//'\r\n';
    }
    
    //alert(this.errorText);
    new WindowObject().errorAlert(this.errorText);
    
};

//Eklenen hata mesajlarını gösterir.
Validation.prototype.alertErrorMessagesNotClose = function(){
    for(i=0; i<this.errorMessageArray.length; i++){
        this.errorText += this.errorMessageArray[i] + '|';//'\r\n';
    }
    
    new WindowObject().errorAlertNotClose(this.errorText);
};

//Hata mesajı ekler.
Validation.prototype.addErrorMessages = function(message){
    /*var text = '--Hata:\r\n';
    
    text += message;
    
    alert(text);*/
    //this.errorText += message + '\r\n';
    this.pageIsValid = false;
    this.errorMessageArray.push(message);
    
};

//Hata mesajı gösterir.
Validation.prototype.alertMessages = function(message){
    /*var text = '--Hata:\r\n';
    
    text += message;
    
    alert(text);*/
    new WindowObject().errorAlert(message);
};

//Validasyon objesi bitti.
//-----------------------------------------------------------------------------------------