
function ValidateText() {
        
        this.checkText = function(input_txt_str, chk_W) {

                // chk_W is means if check special charactor //
                // Erase whitespace located on front and backward of the inputed string //
                // ^ means first of the word //
                // \s means whitespace //
                // + means repeat over 1 //
                // $ means end of the word //
                // g abbreviation of global , it meams whole replacing //
                
                var tmp_str = input_txt_str.replace(/(^\s+)|(\s+$)/g, "");
                
                if (tmp_str != "") {
                        if (chk_W) {

                                // Search special character //
                                // \W means special character //

                                var is_W_in = tmp_str.search(/\W/g);
                                
                                if (is_W_in != -1) {
                                        tmp_str = null;
                                }
                        }
                }

                return tmp_str;
        }
	
	
	this.checkTextAndPoint = function(txt_str, chk_W) {
		
		var tmp_str = txt_str.replace(/(^\s+)|(\s+$)/g, "");
		
		if (tmp_str != "") {
			if (chk_W) {
				var re_tmp_str = tmp_str.replace(/[.]/g, "");
				var is_W_in = re_tmp_str.search(/\W/g);
				
				if (is_W_in != -1) {
					tmp_str = null;
				}
			}
		}
		
		return tmp_str;
	}
	
	
	this.checkNumberAndPoint = function(txt_str, chk_W) {
		
		var tmp_str = txt_str.replace(/(^\s+)|(\s+$)/g, "");
		
		if (tmp_str != "") {
			if (chk_W) {
				var re_tmp_str = tmp_str.replace(/[.]/g, "");
				var is_W_in = re_tmp_str.search(/\D/g);
				
				if (is_W_in != -1) {
					tmp_str = null;
				}
			}
		}
		
		return tmp_str;
	}
        
        this.checkCoupledBox = function(box_arr) {

                var tmp_box_arr = new Array(box_arr.length);
                var return_arr = new Array(2);
                var chk_is_couple = 0;
                var couple_idx_arr = new Array();

                for(var i = 0; i < box_arr.length; i += 2) {
                        
                        for(var j = i; j < (i + 2); j++) {

                                tmp_box_arr[j] = box_arr[j].replace(/(^\s+)|(\s+$)/g, "");

                                if (tmp_box_arr[j] == "") {

                                        chk_is_couple++;
                                }
                        }

                        if ((chk_is_couple % 2) == 1) {

                                return_arr = null;
                                
                                return return_arr;
                        }

                        if ((chk_is_couple / 2) == 0) {

                                couple_idx_arr.push(i);
                        }
                        
                        chk_is_couple = 0;
                }

                return_arr[0] = tmp_box_arr;
                return_arr[1] = couple_idx_arr;

                return return_arr;
        }

        
        this.isFastaFormat = function(fasta_text_arg) {
                
                var fasta_text = fasta_text_arg;
                
                var return_boolean = false;
                
                if (fasta_text.charAt(0) == '>') {
                        if (fasta_text.match("\n")) {
                                return_boolean = true;
                        }
                }
                
                return return_boolean;
        }

}


function FastaRecord () {
	
	this.description;
	this.sequence;
}


function FastaParser () {

	this.parse = function(fasta_seq) {

		var validator = new ValidateText();

		var is_fasta = validator.isFastaFormat(fasta_seq);
		
		var fasta_record = new FastaRecord(); 
		
		if (is_fasta) {
			fasta_seq = fasta_seq.replace(/(^\s+)|(\s+$)/g, "");
			fasta_record.description = fasta_seq.substring(0, fasta_seq.indexOf("\n")).replace(/(^\s+)|(\s+$)/g, "");
			fasta_record.sequence = fasta_seq.substring(fasta_seq.indexOf("\n"), fasta_seq.length).replace(/\s/g, "");
		} else {
			fasta_record = null;	
		}
		
		return fasta_record;
		
	}
	
	
	this.normalizeFasta = function(fasta_seq) {
		
		var fasta_record = this.parse(fasta_seq);
		if ( fasta_record != null) {
			return fasta_record.description + "\n" + fasta_record.sequence;
		} else {
			return fasta_seq;
		}
		
	}
}

