var DialingRule = Class.create();

Object.extend(DialingRule, {

  instancesByCountryPrefix: {},

  instancesByCountryCode: {},
  
  addInstance: function(instance) {
    this.instancesByCountryPrefix[parseInt(instance.countryPrefix)] = instance;
    for (var i=0; i < instance.countryCodes.length; i++) {
      this.instancesByCountryCode[instance.countryCodes[i]] = instance;      
    }
  },
  
	parse: function(number) {
		if (number[0] != '+' && number.substr(0, 2) != '00') {
			return null;
		}
		number = number.replace(/^[\+0]+/, '')
		var instance = null, last = null;
		for (var i=1; i < 5; i++) {
			last = this.byCountryPrefix(number.substr(0,i));
			if (last) instance = last;
			if (last && instance && i > 1) break;
		}
		return instance;  
	},
  
  byCountryPrefix: function(countryPrefix) {
    return this.instancesByCountryPrefix[parseInt(countryPrefix)];
  },
  
  byCountryCode: function(countryCode) {
    return this.instancesByCountryCode[countryCode];
  }
});

DialingRule.prototype = {

  initialize: function(countryPrefix, internationalPrefix, nationalPrefix, retainsNationalPrefix, countryCodes, filename) {
    this.countryPrefix = countryPrefix;
    this.internationalPrefix = internationalPrefix;
    this.nationalPrefix = nationalPrefix;
    this.retainsNationalPrefix = retainsNationalPrefix;
    this.countryCodes = countryCodes;
    this.filename = filename;
    DialingRule.addInstance(this);
  },
  
	normalize: function(number) {
		number = number.replace(/\s+/, '')
		if (number[0] == '+') {
			//number = number.substr(1)
		} else if (number.substr(0, this.internationalPrefix.length) == this.internationalPrefix) {
			//number = number.substr(this.internationalPrefix.length);
		} else if (number.substr(0, this.nationalPrefix.length) == this.nationalPrefix) {
			if (this.retainsNationalPrefix)
				number = this.countryPrefix + number;
			else
				number = this.countryPrefix + number.substr(this.nationalPrefix.length);
		}
		return number;
	}  
}

var d = DialingRule;
new d('1','011','1',false,["US", "CA"],'united_states');
new d('1242','00','1',false,["BS"],'bahamas');
new d('1246','011','1',false,["BB"],'barbados');
new d('1264','011','1',false,["AI"],'anguilla');
new d('1268','011','1',false,["AG"],'antigua_and_barbuda');
new d('1284','0011','1',false,["IO"],'british_indian_ocean_territory');
new d('1340','011','1',false,["VI"],'virgin_islands');
new d('1345','011','1',false,["KY"],'cayman_islands');
new d('1441','011','1',false,["BM"],'bermuda');
new d('1473','011','1',false,["GD"],'grenada');
new d('1649','011','1',false,["TC"],'turks_and_caicos_islands');
new d('1664','011','1',false,["MS"],'montserrat');
new d('1670','011','1',false,["MP"],'northern_mariana_islands');
new d('1671','011','1',false,["GU"],'guam');
new d('1758','011','1',false,["LC"],'saint_lucia');
new d('1767','011','1',false,["DM"],'dominica');
new d('1784','011','1',false,["VC"],'saint_vincent_and_the_grenadines');
new d('1787','011','1',false,["PR"],'puerto_rico');
new d('1808','011','1',false,["US"],'united_states');
new d('1809','011','1',false,["DO"],'dominican_republic');
new d('1868','011','1',false,["TT"],'trinidad_and_tobago');
new d('1869','011','1',false,["KN"],'saint_kitts_and_nevis');
new d('1876','011','1',false,["JM"],'jamaica');
new d('20','00','0',false,["EG"],'egypt');
new d('212','00','',false,["MA"],'morocco');
new d('213','00','7',false,["DZ"],'algeria');
new d('216','00','0',false,["TN"],'tunisia');
new d('218','00','0',false,["LY"],'libya');
new d('220','00','',false,["GM"],'gambia');
new d('221','00','0',false,["SN"],'senegal');
new d('222','00','0',false,["MR"],'mauritania');
new d('223','00','0',false,["ML"],'mali');
new d('224','00','0',false,["GN"],'guinea');
new d('225','0','0',false,["CI"],'cote_divoire');
new d('226','00','',false,["BF"],'burkina_faso');
new d('227','00','0',false,["NE"],'niger');
new d('228','00','',false,["TG"],'togo');
new d('229','00','',false,["BJ"],'benin');
new d('230','00','0',false,["MU"],'mauritius');
new d('231','00','22',false,["LR"],'liberia');
new d('232','00','0',false,["SL"],'sierra_leone');
new d('233','00','',false,["GH"],'ghana');
new d('234','009','0',false,["NG"],'nigeria');
new d('235','15','',false,["TD"],'chad');
new d('236','00','',false,["CF"],'central_african_republic');
new d('237','00','',false,["CM"],'cameroon');
new d('238','0','',false,["CV"],'cape_verde');
new d('239','00','0',false,["ST"],'sao_tome_and_principe');
new d('240','00','',false,["GQ"],'equatorial_guinea');
new d('241','00','',false,["GA"],'gabon');
new d('242','00','',false,["CG"],'congo_republic');
new d('243','00','',false,["CD"],'congo_democratic_republic');
new d('244','00','0',false,["AO"],'angola');
new d('245','00','',false,["GW"],'guinea_bissau');
new d('246','00','',false,["IO"],'british_indian_ocean_territory');
new d('247','00','',false,["SH"],'united_kingdom');
new d('248','00','0',false,["SC"],'seychelles');
new d('249','00','0',false,["SD"],'sudan');
new d('250','00','0',false,["RW"],'rwanda');
new d('251','00','0',false,["ET"],'ethiopia');
new d('252','00','',false,["SO"],'somalia');
new d('253','00','',false,["DJ"],'djibouti');
new d('254','000','0',false,["KE"],'kenya');
new d('255','011','0',false,["TZ"],'tanzania');
new d('256','000','0',false,["UG"],'uganda');
new d('257','00','',false,["BI"],'burundi');
new d('258','00','0',false,["MZ"],'mozambique');
new d('260','00','',false,["ZM"],'zambia');
new d('261','00','0',false,["MG"],'madagascar');
new d('262','00','0',false,["RE"],'france');
new d('263','00','',false,["ZW"],'zimbabwe');
new d('264','00','0',false,["NA"],'namibia');
new d('265','00','',false,["MW"],'malawi');
new d('266','00','0',false,["LS"],'lesotho');
new d('267','00','',false,["BW"],'botswana');
new d('268','00','',false,["SZ"],'swaziland');
new d('269','00','',false,["KM", "YT"],'comoros');
new d('27','09','0',false,["ZA"],'south_africa');
new d('290','00','',false,["SH"],'saint_helena');
new d('291','00','0',false,["ER"],'eritrea');
new d('297','00','',false,["AW"],'aruba');
new d('298','00','',false,["FO"],'faroe_islands');
new d('299','00','',false,["GL"],'greenland');
new d('30','00','',false,["GR"],'greece');
new d('31','00','0',false,["NL"],'netherlands');
new d('32','00','0',false,["BE"],'belgium');
new d('33','00','0',false,["FR"],'france');
new d('34','00','',false,["ES"],'spain');
new d('350','00','',false,["GI"],'gibraltar');
new d('351','00882','',false,["PT"],'portugal');
new d('352','00','',false,["LU"],'luxembourg');
new d('353','00','0',false,["IE"],'ireland');
new d('354','00','0',false,["IS"],'iceland');
new d('355','00','0',false,["AL"],'albania');
new d('356','00','21',false,["MT"],'malta');
new d('357','00','',false,["CY"],'cyprus');
new d('358','00','0',false,["FI"],'finland');
new d('359','00','0',false,["BG"],'bulgaria');
new d('36','00','06',false,["HU"],'hungary');
new d('370','00','8',false,["LT"],'lithuania');
new d('371','00','0',false,["LV"],'latvia');
new d('372','00','',false,["EE"],'estonia');
new d('373','00','0',false,["MD"],'moldova');
new d('374','00','8',false,["AM"],'armenia');
new d('375','8**10','8',false,["BY"],'belarus');
new d('376','00','',false,["AD"],'andorra');
new d('377','00','0',false,["MC"],'monaco');
new d('378','00','0',false,["SM"],'san_marino');
new d('380','8**10','8',false,["UA"],'ukraine');
new d('381','00','0',false,["CS"],'serbia_montenegro');
new d('385','0','0',false,["HR"],'croatia');
new d('386','00','0',false,["SI"],'slovenia');
new d('387','00','0',false,["BA"],'bosnia_and_herzegovina');
new d('389','00','0',false,["MK"],'macedonia');
new d('39','00','',true,["IT"],'italy');
new d('40','00','0',false,["RO"],'romania');
new d('41','00','0',false,["CH"],'switzerland');
new d('420','00','',false,["CZ"],'czech_republic');
new d('421','00','0',false,["SK"],'slovakia');
new d('423','00','',false,["LI"],'liechtenstein');
new d('43','00','0',false,["AT"],'austria');
new d('44','00','0',false,["GB"],'united_kingdom');
new d('45','00','',false,["DK"],'denmark');
new d('46','00','0',false,["SE"],'sweden');
new d('47','00','',false,["NO"],'norway');
new d('48','0**0','0',false,["PL"],'poland');
new d('49','00','0',false,["DE"],'germany');
new d('500','00','',false,["FK"],'falkland_islands');
new d('501','00','0',false,["BZ"],'belize');
new d('502','00','',false,["GT"],'guatemala');
new d('503','00','',false,["SV"],'el_salvador');
new d('504','00','0',false,["HN"],'honduras');
new d('505','00','0',false,["NI"],'nicaragua');
new d('506','00','',false,["CR"],'costa_rica');
new d('507','00','0',false,["PA"],'panama');
new d('508','00','0',false,["PM"],'saint_pierre_and_miquelon');
new d('509','00','0',false,["HT"],'haiti');
new d('51','00','0',false,["PE"],'peru');
new d('52','00','01',false,["MX"],'mexico');
new d('53','119','0',false,["CU"],'cuba');
new d('54','00','0',false,["AR"],'argentina');
new d('55','00','0',false,["BR"],'brazil');
new d('56','00','00',false,["CL"],'chile');
new d('57','00','0',false,["CO"],'colombia');
new d('58','00','0',false,["VE"],'venezuela');
new d('590','00','',false,["GP"],'france');
new d('591','00','0',false,["BO"],'bolivia');
new d('592','001','0',false,["GY"],'guyana');
new d('593','00','0',false,["EC"],'ecuador');
new d('594','00','',false,["GF"],'france');
new d('595','002','0',false,["PY"],'paraguay');
new d('596','00','',false,["MQ"],'martinique');
new d('597','00','',false,["SR"],'suriname');
new d('598','00','0',false,["UY"],'uruguay');
new d('599','00','0',false,["AN"],'netherlands_antilles');
new d('60','00','0',false,["MY"],'malaysia');
new d('61','0011','0',false,["AU", "CX"],'australia');
new d('62','001','0',false,["ID"],'indonesia');
new d('63','00','0',false,["PH"],'philippines');
new d('64','00','',false,["NZ"],'new_zealand');
new d('65','00','',false,["SG"],'singapore');
new d('66','001','0',false,["TH"],'thailand');
new d('670','00','',false,["TL"],'east_timor');
new d('672','','',false,["AQ", "NF"],'antarctica');
new d('673','00','0',false,["BN"],'brunei');
new d('674','00','0',false,["NR"],'nauru');
new d('675','05','',false,["PG"],'papua_new_guinea');
new d('676','00','',false,["TO"],'tonga');
new d('677','00','',false,["SB"],'solomon_islands');
new d('678','00','',false,["VU"],'vanuatu');
new d('679','00','',false,["FJ"],'fiji');
new d('680','011','',false,["PW"],'palau');
new d('682','00','00',false,["CK"],'cook_islands');
new d('683','00','0',false,["NU"],'niue');
new d('684','00','',false,["AS"],'american_samoa');
new d('686','00','0',false,["KI"],'kiribati');
new d('687','00','0',false,["NC"],'france');
new d('688','00','',false,["TV"],'tuvalu');
new d('689','00','',false,["PF"],'french_polynesia');
new d('690','00','1',false,["TK"],'new_zealand');
new d('691','011','1',false,["FM"],'micronesia');
new d('692','011','1',false,["MH"],'marshall_islands');
new d('7','8**10','8',false,["RU", "KZ"],'russia');
new d('81','00','0',false,["JP"],'japan');
new d('82','00','0',false,["KR"],'south_korea');
new d('84','00','',false,["VN"],'vietnam');
new d('850','00','0',false,["KP"],'north_korea');
new d('852','00','0',false,["HK"],'hong_kong');
new d('853','00','0',false,["MO"],'macau');
new d('855','01','0',false,["KH"],'cambodia');
new d('856','00','0',false,["LA"],'laos');
new d('86','00','0',false,["CN"],'china');
new d('880','00','0',false,["BD"],'bangladesh');
new d('886','002','',false,["TW"],'taiwan');
new d('90','99','9',false,["TR"],'turkey');
new d('91','00','0',false,["IN"],'india');
new d('92','00','0',false,["PK"],'pakistan');
new d('93','00','0',false,["AF"],'afghanistan');
new d('94','00','0',false,["LK"],'sri_lanka');
new d('95','00','',false,["MM"],'myanmar');
new d('960','00','0',false,["MV"],'maldives');
new d('961','00','0',false,["LB"],'lebanon');
new d('962','00','0',false,["JO"],'jordan');
new d('963','00','',false,["SY"],'syria');
new d('964','00','0',false,["IQ"],'iraq');
new d('965','00','0',false,["KW"],'kuwait');
new d('966','00','0',false,["SA"],'saudi_arabia');
new d('968','00','0',false,["OM"],'oman');
new d('971','00','',false,["AE"],'united_arab_emirates');
new d('972','00','0',false,["IL"],'israel');
new d('973','00','',false,["BH"],'bahrain');
new d('974','00','0',false,["QA"],'qatar');
new d('975','00','',false,["BT"],'bhutan');
new d('976','001','0',false,["MN"],'mongolia');
new d('977','00','0',false,["NP"],'nepal');
new d('98','00','0',false,["IR"],'iran');
new d('992','8**10','8',false,["TJ"],'tajikistan');
new d('993','8**10','8',false,["TM"],'turkmenistan');
new d('994','00','8',false,["AZ"],'azerbaijan');
new d('995','8**10','8',false,["GE"],'georgia');
new d('996','00','0',false,["KG"],'kyrgyzstan');
new d('998','8**10','8',false,["UZ", "YE"],'uzbekistan');

