var subnet_mask = new Array(0, 128, 192, 224, 240, 248, 252, 254, 255);

function addr_obj(addr, e_msg, allow_zero, is_mask, is_network){	
	this.addr = addr;
	this.e_msg = e_msg;
	this.allow_zero = allow_zero;		
	this.is_mask = is_mask;	
	this.is_network = is_network;
}

function ip4_obj(ip, e_msg, min_range, max_range){	
	this.ip = ip;	
	this.e_msg = e_msg;	
	this.min_range = min_range;
	this.max_range = max_range;			
}

function raidus_obj(ip, port, secret, e_msg){	
	this.ip = ip;
	this.port = port;
	this.secret = secret;	
	this.e_msg = e_msg;
}

function varible_obj(var_value, e_msg, min, max, is_even){	
	this.var_value = var_value;
	this.e_msg = e_msg;
	this.min = min;
	this.max = max;		
	this.is_even = is_even;		
}

function check_ip4(ip4){
	var temp_ip = (ip4.ip).split(" ");
	
	if (ip4.ip == ""){
		alert(ip4.e_msg[ZERO_IP]);
		return false;
	}else if (isNaN(ip4.ip) || temp_ip.length > 1 || parseInt(ip4.ip) < ip4.min_range || parseInt(ip4.ip) > ip4.max_range){
		alert(ip4.e_msg[INVALID_IP]);
		return false;
	}
	return true;
}

function check_ip_range(order, my_obj){
	var which_ip = (my_obj.addr[order]).split(" ");				
	var start, end, in_range;
				
	if (isNaN(which_ip) || which_ip == "" || which_ip.length > 1){
		alert(my_obj.e_msg[FIRST_IP_ERROR + order]);
		return false;
	}
	
	if (my_obj.is_mask){	// check Subnet mask range
		var i = 0;
		
		if (order == 0){	// when it's 1st address
			i = 1;		    // the 1st address can't be 0
		}
		for (; i < subnet_mask.length; i++){			
			if (parseInt(which_ip) == subnet_mask[i]){
				in_range = true;
				break;											
			}else{
				in_range = false;
			}
		}	
		if (!in_range){
			alert(my_obj.e_msg[FIRST_RANGE_ERROR + order]);
			return false;
		}	
	}else{
		if (order != 0 && order != 3){
			start = 0;
			end = 254;
		}else{					
			if (order == 3 && my_obj.is_network){
				start = 0;
				end = 255;
			}else{
				start = 1;
				end = 254;
			}
		}
			
		if (parseInt(which_ip) < start || parseInt(which_ip) > end){
			alert(my_obj.e_msg[FIRST_RANGE_ERROR + order]);
			return false;
		}
	}				
	return true;
}

function is_valid_ip(my_obj){
	var count_zero = 0;
	var ip = my_obj.addr;
	
	for(var i = 0; i < ip.length; i++){
		if (ip[i] == "0"){
			count_zero++;
		}								
	}
	
	if (!my_obj.allow_zero && count_zero == 4){
		alert(my_obj.e_msg[ZERO_IP]);
		return false;
	}else{
		if (count_zero != 4){
			for(var i = 0; i < ip.length; i++){
				if (!check_ip_range(i, my_obj)){
					return false;
				}							
			}
		}
	}
	return true;				
}

function check_address(my_obj){					
	if (my_obj.addr.length == 4){										
		return is_valid_ip(my_obj);
	}else{
		alert(my_obj.e_msg[INVALID_IP]);	// show invalid ip msg
		return false;
	}				
}

function check_hex(data){	
	data = data.toUpperCase();
	
	if (!(data >= 'A' && data <= 'F') && !(data >= '0' && data <= '9')){	
		return false;
	}	
	return true;
}

function check_key(){            	                        	
	var length = get_length();	
	var wep_def_key = get_by_name("wep_def_key");
	var wep_key_type = get_by_id("wep_key_type").value;
	var key_len_msg;
	
	for (var i = 1; i < 5; i++){					
	    var key = get_by_id("key" + i).value;
	    
	    if (wep_def_key[i-1].checked){
	        if (key == ''){
	            alert(msg[WEP_KEY_EMPTY]);
		        return false;
	        }
	    }
	    
	    key_len_msg = get_key_len_msg(i);
	    	    
        if (key != ''){
            if (key.length < length){
                alert(show_key_len_error(key_len_msg, length));
                return false;
            }else{
            	if (wep_key_type == "0"){	// check the key is hex or not
	            	for (var j = 0; j < key.length; j++){
	            		if (!check_hex(key.substring(j, j+1))){
	            			alert(illegal_key_error[i-1]);
	            			return false;
	            		}
	            	}
	            }
            }
        }                	  
	}                	                	
	
	return true;
}

function check_mask(my_mask){
	var temp_mask = my_mask.addr;							
	var in_range = false;
	var error;
	
	for (var i = 0; i < temp_mask.length; i++){	
		var mask = parseInt(temp_mask[i]);										
		if (i != 0 && mask != 0){ // when not the 1st range and the value is not 0
			if (parseInt(temp_mask[i-1]) != 255){  // check the previous value is 255 or not
				alert(my_mask.e_msg[INVALID_IP]);
				return false;
			}
		}					
	}
	return true;
}

function check_domain(ip, mask, gateway){
	var temp_ip = ip.addr;
	var temp_mask = mask.addr;
	var temp_gateway = gateway.addr;
	var is_same = true;
	
	if (temp_gateway[0] == 0 && temp_gateway[1] == 0 && temp_gateway[2] == 0
			&& temp_gateway[3] == 0){
		if (gateway.allow_zero){
			return is_same;
		}
	}
		
	for (var i = 0; i < temp_ip.length - 1; i++){
		if ((temp_ip[i] & temp_mask[i]) != (temp_gateway[i] & temp_mask[i])){
			alert(msg[NOT_SAME_DOMAIN]);
			is_same = false;		// when not in the same subnet mask, return false
			break;
		}
	}

	return is_same;
}

function check_lan_setting(ip, mask, gateway){				
	var temp_ip_obj = new addr_obj(ip.split("."), ip_addr_msg, false, false, false);
	var temp_mask_obj = new addr_obj(mask.split("."), subnet_mask_msg, false, true, false);
	var temp_gateway_obj = new addr_obj(gateway.split("."), gateway_msg, true, false, false);
		
	if (!check_address(temp_ip_obj)){
		return false;		// when ip is invalid
	}else if (!check_address(temp_mask_obj)){
		return false;	// when subnet mask is invalid
	}else if (!check_mask(temp_mask_obj)){
		return false;   // when subnet mask is not in the subnet mask range
	}else if (!check_address(temp_gateway_obj)){
		return false;	// when gateway is invalid
	}else if (!check_domain(temp_ip_obj, temp_mask_obj, temp_gateway_obj)){		// check if the ip and the gateway are in the same subnet mask or not					
		return false;
	}
	return true;
}

function check_port(port){
    var temp_port = port.split(" ");
    
    if (isNaN(port) || port == "" || temp_port.length > 1 
    		|| (parseInt(port) < 1 || parseInt(port) > 65534)){
        return false;
    }
    return true;
}

function check_pwd(pwd1, pwd2){
	if (get_by_id(pwd1).value != get_by_id(pwd2).value){
		 alert(msg[MATCH_PWD_ERROR]);
		 return false;
	}
	return true;
}

function check_ssid(id){
	if (get_by_id(id).value == ""){
	    alert(msg[SSID_EMPTY_ERROR]);
	    return false;
	}
	return true;        
}

function check_varible(obj){
	var temp_obj = (obj.var_value).split(" ");
	
	if (temp_obj == "" || temp_obj.length > 1){	
		alert(obj.e_msg[EMPTY_VARIBLE_ERROR]);
		return false;
	}else if (isNaN(obj.var_value)){
		alert(obj.e_msg[INVALID_VARIBLE_ERROR]);
		return false;
	}else if (parseInt(obj.var_value) < obj.min || parseInt(obj.var_value) > obj.max){
		alert(obj.e_msg[VARIBLE_RANGE_ERROR]);
		return false;
	}else if (obj.is_even && (parseInt(obj.var_value) % 2 != 0)){
		alert(obj.e_msg[EVEN_NUMBER_ERROR]);
		return false;
	}
	return true;
}

function exit_wizard(){
    if (confirm(msg[QUIT_WIZARD])){
        window.close();
    }
}

function get_by_id(id){
	with(document){
		return getElementById(id);
	}
}

function get_by_name(name){
	with(document){
		return getElementsByName(name);
	}
}

function get_key_len_msg(which_key){
	switch(which_key){
    	case 1 :
    		return key1_len_error;    		
    	case 2 :
    		return key2_len_error;    		
    	case 3 :
    		return key3_len_error;    		
    	case 4 :
    		return key4_len_error;    	
	}
}

function get_length(){
	var wep_key_len = parseInt(get_by_id("wep_key_len").value);
	var length;
	
	switch(wep_key_len){
		case 1 :
			length = 5;
			break;
		case 2 :
			length = 13;
			break;
		default :
			length = 5;
			break;
	}	
	
	if (get_by_id("wep_key_type").value == "0"){
	    length *= 2;
	}
	return length;
}

function send_submit(which_form){
	get_by_id(which_form).submit();
}


function show_key_len_error(key_len_msg, length){
	switch(length){
		case 5 :
			return key_len_msg[0];
		case 13 :
			return key_len_msg[1];
		case 10 :
			return key_len_msg[2];
		case 26:
			return key_len_msg[3];			
	}
}

function show_words(word){
	with(document){
		return write(word);
	}
}
         function show_scan(){
    window.open("scan.htm",
                "scan",
                "width=460,height=320,resizable=1,scrollbars=1");
}

function get_row_data(obj, index){
    try {
    	return obj.cells[index].childNodes[0].data;
    }catch(e) {
        return ("");
    }
}


function popupwin () {
window.open("restart.html","url","scrolling=no,width=780,height=300,navigation=no")

}