[SCCP] use SCCP address decoder, add SCCP address encoder
diff --git a/src/sccp_codec.erl b/src/sccp_codec.erl
index dd24735..efe36ab 100644
--- a/src/sccp_codec.erl
+++ b/src/sccp_codec.erl
@@ -122,12 +122,13 @@
 	<<PtrVar:8, PtrOpt:8, _/binary>> = RemainVar,
 	CalledPartyLen = binary:at(RemainVar, PtrVar),
 	CalledParty = binary:part(RemainVar, PtrVar+1, CalledPartyLen),
+	CalledPartyDec = parse_sccp_addr(CalledParty),
 	% optional part
 	OptBin = binary:part(RemainVar, 1 + PtrOpt, byte_size(RemainVar)-(1+PtrOpt)),
 	OptList = parse_sccp_opts(OptBin, []),
 	%OptList = [],
 	% build parsed list of message
-	[{src_local_ref, SrcLocalRef},{protocol_class, ProtoClass},{called_party_addr, CalledParty}|OptList];
+	[{src_local_ref, SrcLocalRef},{protocol_class, ProtoClass},{called_party_addr, CalledPartyDec}|OptList];
 parse_sccp_msgt(?SCCP_MSGT_CC, DataBin) ->
 	% first get the fixed part
 	<<_:8, DstLocalRef:24/big, SrcLocalRef:24/big, ProtoClass:8, Remain/binary >> = DataBin,
@@ -172,12 +173,14 @@
 	% variable part
 	CalledPartyLen = binary:at(Remain, CalledPartyPtr-3),
 	CalledParty = binary:part(Remain, CalledPartyPtr-3+1, CalledPartyLen),
+	CalledPartyDec = parse_sccp_addr(CalledParty),
 	CallingPartyLen = binary:at(Remain, CallingPartyPtr-2),
 	CallingParty = binary:part(Remain, CallingPartyPtr-2+1, CallingPartyLen),
+	CallingPartyDec = parse_sccp_addr(CallingParty),
 	DataLen = binary:at(Remain, DataPtr-1),
 	UserData = binary:part(Remain, DataPtr-1+1, DataLen),
-	[{protocol_class, ProtoClass},{called_party_addr, CalledParty},
-	 {calling_party_addr, CallingParty},{user_data, UserData}];
+	[{protocol_class, ProtoClass},{called_party_addr, CalledPartyDec},
+	 {calling_party_addr, CallingPartyDec},{user_data, UserData}];
 parse_sccp_msgt(?SCCP_MSGT_UDTS, DataBin) ->
 	parse_sccp_msgt(?SCCP_MSGT_UDT, DataBin);
 parse_sccp_msgt(?SCCP_MSGT_ED, DataBin) ->
@@ -211,6 +214,60 @@
 
 % Encoding Part
 
+encode_gt(#global_title{gti = GTind, phone_number = PhoneNum,
+			nature_of_addr_ind = Nature,
+			trans_type = TransType, encoding = Enc,
+			numbering_plan = NumPlan}) ->
+	case GTind of
+		?SCCP_GTI_NO_GT ->
+			{GTind, <<>>};
+		?SCCP_GTI_NAT_ONLY ->
+			% Figure 7/Q.713
+			{PhoneBin, OddEven} = isup_codec:encode_isup_party(PhoneNum),
+			{GTind, <<OddEven:1, Nature:7, PhoneBin/binary>>};
+		?SCCP_GTI_TT_ONLY ->
+			% Figure 9/Q.913
+			% Used in national interfaces only, we cannot parse Digits
+			{GTind, <<TransType:8, PhoneNum/binary>>};
+		?SCCP_GTI_TT_NP_ENC ->
+			% Figure 10/Q.713
+			{_Odd, PhoneBin} = isup_codec:encode_isup_party(PhoneNum),
+			{GTind, <<TransType:8, NumPlan:4, Enc:4, PhoneBin/binary>>};
+		?SCCP_GTI_TT_NP_ENC_NAT ->
+			% Figure 11/Q.713
+			{PhoneBin, _Odd} = isup_codec:encode_isup_party(PhoneNum),
+
+			{GTind, <<TransType:8, NumPlan:4, Enc:4, 0:1, Nature:7, PhoneBin/binary>>}
+	end.
+
+encode_pc(PointCode) ->
+	case PointCode of
+		undef ->
+			{0, <<>>};
+		_ ->
+			{1, <<PointCode:16/big>>}
+	end.
+
+encode_ssn(SSN) ->
+	case SSN of
+		undef ->
+			{0, <<>>};
+		_ ->
+			{1, <<SSN:8>>}
+	end.
+
+encode_sccp_addr(#sccp_addr{res_nat_use = ResNatUse,
+			    route_on_ssn = RoutInd,
+			    point_code = PointCode,
+			    ssn = SSN,
+			    global_title = GT}) ->
+
+	{GTind, GTbin} = encode_gt(GT),
+	{SSNind, SSNbin} = encode_ssn(SSN),
+	{PCind, PCbin} = encode_pc(PointCode),
+	<<ResNatUse:1, RoutInd:1, GTind:4, SSNind:1, PCind:1, PCbin/binary, SSNbin/binary, GTbin/binary>>.
+
+
 encode_sccp_opt({OptNum, {DataBinLen, DataBin}}) when is_integer(OptNum) ->
 	DataBinLen8 = DataBinLen*8,
 	<<OptNum:8, DataBinLen:8, DataBin:DataBinLen8>>;
@@ -272,17 +329,19 @@
 encode_sccp_msgt(?SCCP_MSGT_UDT, Params) ->
 	ProtoClass = proplists:get_value(protocol_class, Params),
 	CalledParty = proplists:get_value(called_party_addr, Params),
-	CalledPartyLen = byte_size(CalledParty),
+	CalledPartyEnc = encode_sccp_addr(CalledParty),
+	CalledPartyLen = byte_size(CalledPartyEnc),
 	CallingParty = proplists:get_value(calling_party_addr, Params),
-	CallingPartyLen = byte_size(CallingParty),
+	CallingPartyEnc = encode_sccp_addr(CallingParty),
+	CallingPartyLen = byte_size(CallingPartyEnc),
 	UserData = proplists:get_value(user_data, Params),
 	UserDataLen = byte_size(UserData),
 	% variable part
 	CalledPartyPtr = 3,
 	CallingPartyPtr = 2 + (1 + CalledPartyLen),
 	DataPtr = 1 + (1 + CalledPartyLen) + (1 + CallingPartyLen),
-	Remain = <<CalledPartyLen:8, CalledParty/binary,
-		   CallingPartyLen:8, CallingParty/binary,
+	Remain = <<CalledPartyLen:8, CalledPartyEnc/binary,
+		   CallingPartyLen:8, CallingPartyEnc/binary,
 		   UserDataLen:8, UserData/binary>>,
 	<<?SCCP_MSGT_UDT:8, ProtoClass:8, CalledPartyPtr:8, CallingPartyPtr:8, DataPtr:8, Remain/binary>>;
 %encode_sccp_msgt(?SCCP_MSGT_UDTS, Params) ->