comunika_gsm 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- function binToInt(t){for(var e=0,r=parseInt(t.length)-1,n=0;n<t.length;n++)"1"==t.charAt(n)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,n=parseInt(t),s=n.toString(r),a=s.length;e>a;a++)s="0"+s;return s}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function getSevenBit(t){for(var e=0;e<sevenbitdefault.length;e++)if(sevenbitdefault[e]==t)return e;return 0}function getEightBit(t){return t}function get16Bit(t){return t}function phoneNumberMap(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"*":return"A";case"#":return"B";case"A":return"C";case"B":return"D";case"C":return"E";default:return"F"}return"F"}function phoneNumberUnMap(t){if(t>="0"&&"9">=t)return t;switch(t){case 10:return"*";case 11:return"#";case 12:return"A";case 13:return"B";case 14:return"C";default:return"F"}return"F"}function semiOctetToString(t){for(var e="",r=0;r<t.length;r+=2){var n=t.substring(r,r+2);e=e+phoneNumberMap(n.charAt(1))+phoneNumberMap(n.charAt(0))}return e}function getUserMessage(t,e){var r="";octetArray=new Array,restArray=new Array,septetsArray=new Array;var n=1,s=0,a=0,i="",u="<table border=1 ><tr><td align=center width=75><b>Hex</b></td>",o="<tr><td align=center width=75> <b>&nbsp;&nbsp;&nbsp;Octets&nbsp;&nbsp;&nbsp;</b></td>",g="<table border=1 ><tr><td align=center width=75><b>septets</b></td>",b="<tr><td align=center width=75><b>Character</b></td>";calculation="";for(var c=0;c<t.length;c+=2){var l=t.substring(c,c+2);r+=intToBin(HexToNum(l),8),c%14==0&&0!=c&&(u+="<td align=center width=75>+++++++</td>"),u=u+"<td align=center width=75>"+l+"</td>"}u+="<td align=center width=75>+++++++</td>";for(var c=0;c<r.length;c+=8)octetArray[s]=r.substring(c,c+8),restArray[s]=octetArray[s].substring(0,n%8),septetsArray[s]=octetArray[s].substring(n%8,8),c%56==0&&0!=c&&(o+="<td align=center width=75>&nbsp;</td>"),o=o+"<td align=center width=75><span style='background-color: #FFFF00'>"+restArray[s]+"</span>"+septetsArray[s]+"</td>",n++,s++,8==n&&(n=1);o+="<td align=center width=75>&nbsp;</td>";for(var c=0;c<restArray.length;c++)c%7==0?(0!=c&&(i+=sevenbitdefault[binToInt(restArray[c-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;"+restArray[c-1]+"</span>&nbsp;</td>",b=b+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(restArray[c-1])]+"&nbsp;</td>",a++),i+=sevenbitdefault[binToInt(septetsArray[c])],g=g+"<td align=center width=75>&nbsp;"+septetsArray[c]+"&nbsp;</td>",b=b+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(septetsArray[c])]+"&nbsp;</td>",a++):(i+=sevenbitdefault[binToInt(septetsArray[c]+restArray[c-1])],g=g+"<td align=center width=75>&nbsp;"+septetsArray[c]+"<span style='background-color: #FFFF00'>"+restArray[c-1]+"&nbsp;</span></td>",b=b+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(septetsArray[c]+restArray[c-1])]+"&nbsp;</td>",a++);return a!=e?(i+=sevenbitdefault[binToInt(restArray[c-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;"+restArray[c-1]+"</span>&nbsp;</td>",b=b+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(restArray[c-1])]+"&nbsp;</td>"):(g+="<td align=center width=75>+++++++</td>",b+="<td align=center width=75>&nbsp;</td>"),calculation="Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+u+"</tr>"+o+"</tr></table>"+g+"</tr>"+b+"</tr></table>",i}function getUserMessage16(t,e){var r="";calculation="Not implemented";for(var n=0;n<t.length;n+=4){var s=t.substring(n,n+2),a=t.substring(n+2,n+4);r+=""+String.fromCharCode(256*HexToNum(s)+HexToNum(a))}return r}function getUserMessage8(t,e){var r="";calculation="Not implemented";for(var n=0;n<t.length;n+=2){var s=t.substring(n,n+2);r+=""+String.fromCharCode(HexToNum(s))}return r}function getPDUMetaInfo(t){var e=t,r=0,n="";if("AT"==e.substr(0,2))for(var s=0;s<e.length;s++)if(10==e.charCodeAt(s)){e=e.substr(s+1);break}for(var a="",s=0;s<e.length;s++)16!=MakeNum(e.substr(s,1))&&(a+=e.substr(s,1));e=a;var i=HexToNum(e.substring(0,2)),u=e.substring(2,2+2*i),o=u.substring(0,2),g=u.substring(2,2+2*i);0!=i&&(g=semiOctetToString(g),("F"==g.substr(g.length-1,1)||"f"==g.substr(g.length-1,1))&&(g=g.substring(0,g.length-1)),91==o&&(g="+"+g));var b=2*i+2;r=b;var c=e.substr(r,2);r+=2,32==(32&HexToNum(c))&&(n+="Type::::Receipt requested\n");var l=0;if(64==(64&HexToNum(c))&&(l=1,n+="Type::::Data Header\n"),1==(3&HexToNum(c))||3==(3&HexToNum(c))){3==(3&HexToNum(c))&&(n="Type::::Unknown Message\nTreat as Deliver\n");var d=HexToNum(e.substr(r,2));r+=2;var h=HexToNum(e.substr(r,2));h%2!=0&&(h+=1),r+=2;var p=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+h));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v),r+=h;var T=e.substr(r,2);r+=2;var f=e.substr(r,2),m=tpDCSMeaning(f);r+=2;var A;switch(24&HexToNum(c)){case 0:A="Not Present";break;case 16:A="Rel "+cValid(HexToNum(e.substr(r,2))),r+=2;break;case 8:A="Enhanced - Not Decoded",r+=14;break;case 24:A="Absolute - Not Decoded",r+=14}var y=HexToNum(e.substr(r,2));r+=2;var S=DCS_Bits(f),x="Undefined format";7==S?x=getUserMessage(e.substr(r,e.length-r),y):8==S?x=getUserMessage8(e.substr(r,e.length-r),y):16==S&&(x=getUserMessage16(e.substr(r,e.length-r),y)),x=x.substr(0,y),16==S&&(y/=2),0==n.length&&(n="Type::::Message:\n"),n+="SMSC::::"+g+"\nReceipient::::"+v+"\nValidity::::"+A+"\nTP_PID::::"+T+"\nTP_DCS::::"+f+"\nTP_DCS-popis::::"+m+"Message::::"+x+"\nLength::::"+y}else if(0==(3&HexToNum(c))){n="Type: Receive Message::::";var h=HexToNum(e.substr(r,2));r+=2;var p=e.substr(r,2);r+=2;var v;"D0"==p?(_sl=h,h%2!=0&&(h+=1),v=getUserMessage(e.substring(r,r+h),parseInt(_sl/2*8/7))):(h%2!=0&&(h+=1),v=semiOctetToString(e.substring(r,r+h)),("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v)),r+=h;var T=e.substr(r,2);r+=2;var f=e.substr(r,2),m=tpDCSMeaning(f);r+=2;var M=semiOctetToString(e.substr(r,14)),w=M.substring(0,2),H=M.substring(2,4),N=M.substring(4,6),k=M.substring(6,8),C=M.substring(8,10),F=M.substring(10,12);M=N+"/"+H+"/"+w+" "+k+":"+C+":"+F+" GMT ?",r+=14;var y=HexToNum(e.substr(r,2));r+=2;var S=DCS_Bits(f),x="Undefined format";7==S?x=getUserMessage(e.substr(r,e.length-r),y):8==S?x=getUserMessage8(e.substr(r,e.length-r),y):16==S&&(x=getUserMessage16(e.substr(r,e.length-r),y)),x=x.substr(0,y),x=x.replace(/\n/g,""),x=x.replace("::::",""),16==S&&(y/=2),n+="SMSC::::"+g+"\nSender::::"+v+"\nTimeStamp::::"+M+"\nTP_PID::::"+T+"\nTP_DCS::::"+f+"\nTP_DCS-popis::::"+m+"Message::::"+x+"\nLength::::"+y}else{n="Type::::Status Report\n";var d=HexToNum(e.substr(r,2));r+=2;var h=HexToNum(e.substr(r,2));h%2!=0&&(h+=1),r+=2;var p=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+h));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v),r+=h;var M=semiOctetToString(e.substr(r,14)),w=M.substring(0,2),H=M.substring(2,4),N=M.substring(4,6),k=M.substring(6,8),C=M.substring(8,10),F=M.substring(10,12),I=M.substring(12,14);M=N+"/"+H+"/"+w+" "+k+":"+C+":"+F+" GMT +"+I/4,r+=14;var D=semiOctetToString(e.substr(r,14)),B=D.substring(0,2),U=D.substring(2,4),E=D.substring(4,6),O=D.substring(6,8),P=D.substring(8,10),_=D.substring(10,12),j=M.substring(12,14);D=E+"/"+U+"/"+B+" "+O+":"+P+":"+_+" GMT +"+j/4,r+=14;var R=e.substr(r,2);n+="SMSC::::"+g+"\nSender::::"+v+"\nMessageRef::::"+d+"\nTimeStamp::::"+M+"\nTimeStamp2::::"+D+"\nStatus Byte::::"+R}return n}function change(t){var e=t.value.length;e>maxkeys&&(t.value=t.value.substring(0,maxkeys),alerted=!0,e=maxkeys),window.status="Characters left : "+(maxkeys-e)}function DCS_Bits(t){var e=7,r=HexToNum(t);switch(192&r){case 0:switch(12&r){case 4:e=8;break;case 8:e=16}break;case 192:switch(48&r){case 32:e=16;break;case 48:4&r||(e=8)}}return e}function tpDCSMeaning(t){var e=t,r=HexToNum(t);switch(192&r){case 0:if(e=32&r?"Compressed Text\n":"Uncompressed Text\n",16&r)switch(e+="MClass::",3&r){case 0:e+="0\n";break;case 1:e+="1\n";break;case 2:e+="2\n";break;case 3:e+="3\n"}else e+="MClass::No class\n";switch(e+="Alphabet::::",12&r){case 0:e+="Default\n";break;case 4:e+="8bit\n";break;case 8:e+="UCS2(16)bit\n";break;case 12:e+="Reserved\n"}break;case 64:case 128:e="Reserved coding group\n";break;case 192:switch(48&r){case 0:e="Message waiting group\n",e+="Discard\n";break;case 16:e="Message waiting group\n",e+="Store Message. Default Alphabet\n";break;case 32:e="Message waiting group\n",e+="Store Message. UCS2 Alphabet\n";break;case 48:e="Data coding message class\n",e+=4&r?"Default Alphabet\n":"8 bit Alphabet\n"}}return e}function checkFlag(t){t.checked?(document.pduToStringForm.valid.disabled=!1,document.pduToStringForm.valid.value="170",document.getElementById("validy").innerHTML=cValid("170")):(document.pduToStringForm.valid.disabled=!0,document.pduToStringForm.valid.value="",document.getElementById("validy").innerHTML="")}function Validity(t){return isNaN(parseInt(t))?(t=0,document.pduToStringForm.valid.value=t):(t=parseInt(t),0>t&&(t=0,document.pduToStringForm.valid.value=t),t>255&&(t=255,document.pduToStringForm.valid.value=t)),cValid(t)}function cValid(t){var e,r="";t=parseInt(t),143>=t?e=5*(t+1):167>=t?(e=(t-143)/2+12,e*=60):196>=t?(e=t-166,e*=1440):(e=t-192,e*=10080);var n,s,a,i;return n=e%60,s=e/60,a=s/24,i=a/7,s%=24,a%=7,0!=parseInt(i)&&(r+=parseInt(i)+"w "),0!=parseInt(a)&&(r+=parseInt(a)+"d "),0!=parseInt(s)&&(r+=parseInt(s)+"h "),0!=n&&(r+=n+"m "),r}function binToInt(t){for(var e=0,r=parseInt(t.length)-1,n=0;n<t.length;n++)"1"==t.charAt(n)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,n=parseInt(t),s=n.toString(r),a=s.length;e>a;a++)s="0"+s;return s}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function stringToPDU(t,e,r,n,s,a,i,u){var o=n,g="",b="",c="",l=0,d=0,h="",p="";0!=r&&(h="81","+"==r.substr(0,1)?(h="91",r=r.substr(1)):"0"!=r.substr(0,1)&&(h="91"),r.length%2!=0&&(r+="F"),p=semiOctetToString(r),l=(h+""+p).length/2,d=l),10>l&&(l="0"+l);var v;v=i?u?"3100":"2100":u?"1100":"0100";var T="81";"+"==e.substr(0,1)?(T="91",e=e.substr(1)):"0"!=e.substr(0,1)&&(T="91");var f=intToHex(e.length);e.length%2!=0&&(e+="F");var m=semiOctetToString(e),A="00",y=0;switch(-1!=s&&(y=16|s),o){case 7:break;case 8:y=4|y;break;case 16:y=8|y}var S=intToHex(y),x="";u&&(x=intToHex(a));var M;if(7==o){M=intToHex(t.length);for(var w=0;w<=t.length;w++){if(w==t.length){""!=b&&(c=c+""+intToHex(binToInt(b)));break}var H,N=intToBin(getSevenBit(t.charAt(w)),7);0!=w&&w%8!=0?(g=N.substring(7-w%8),H=g+b,c=c+""+intToHex(binToInt(H)),b=N.substring(0,7-w%8)):b=N.substring(0,7-w%8)}}else if(8==o){M=intToHex(t.length);for(var k=0,w=0;w<t.length;w++)k=getEightBit(t.charCodeAt(w)),c=c+""+ToHex(k)}else if(16==o){M=intToHex(2*t.length);for(var C=0,w=0;w<t.length;w++)C=get16Bit(t.charCodeAt(w)),c=c+""+ToHex((65280&C)>>8)+ToHex(255&C)}var F=l+h+p+v+f+T+m+A+S+x+M,I=F+c,D=I.length/2-d-1;return D+"\n"+I}sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","¡","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","Ä","Ö","Ñ","Ü","§","¿","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ä","ö","ñ","ü","à","á");var calculation="",maxkeys=160,alerted=!1;sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","¡","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","Ä","Ö","Ñ","Ü","§","¿","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ä","ö","ñ","ü","à");var calculation="",maxkeys=160,alerted=!1;
1
+ function binToInt(t){for(var e=0,r=parseInt(t.length)-1,s=0;s<t.length;s++)"1"==t.charAt(s)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,s=parseInt(t),n=s.toString(r),a=n.length;e>a;a++)n="0"+n;return n}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function getSevenBit(t){for(var e=0;e<sevenbitdefault.length;e++)if(sevenbitdefault[e]==t)return e;return 0}function getEightBit(t){return t}function get16Bit(t){return t}function phoneNumberMap(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"*":return"A";case"#":return"B";case"A":return"C";case"B":return"D";case"C":return"E";default:return"F"}return"F"}function phoneNumberUnMap(t){if(t>="0"&&"9">=t)return t;switch(t){case 10:return"*";case 11:return"#";case 12:return"A";case 13:return"B";case 14:return"C";default:return"F"}return"F"}function semiOctetToString(t){for(var e="",r=0;r<t.length;r+=2){var s=t.substring(r,r+2);e=e+phoneNumberMap(s.charAt(1))+phoneNumberMap(s.charAt(0))}return e}function getUserMessage(t,e){var r="";octetArray=new Array,restArray=new Array,septetsArray=new Array;var s=1,n=0,a=0,i="",u="<table border=1 ><tr><td align=center width=75><b>Hex</b></td>",b="<tr><td align=center width=75> <b>&nbsp;&nbsp;&nbsp;Octets&nbsp;&nbsp;&nbsp;</b></td>",g="<table border=1 ><tr><td align=center width=75><b>septets</b></td>",c="<tr><td align=center width=75><b>Character</b></td>";calculation="";for(var o=0;o<t.length;o+=2){var l=t.substring(o,o+2);r+=intToBin(HexToNum(l),8),o%14==0&&0!=o&&(u+="<td align=center width=75>+++++++</td>"),u=u+"<td align=center width=75>"+l+"</td>"}u+="<td align=center width=75>+++++++</td>";for(var o=0;o<r.length;o+=8)octetArray[n]=r.substring(o,o+8),restArray[n]=octetArray[n].substring(0,s%8),septetsArray[n]=octetArray[n].substring(s%8,8),o%56==0&&0!=o&&(b+="<td align=center width=75>&nbsp;</td>"),b=b+"<td align=center width=75><span style='background-color: #FFFF00'>"+restArray[n]+"</span>"+septetsArray[n]+"</td>",s++,n++,8==s&&(s=1);b+="<td align=center width=75>&nbsp;</td>";for(var o=0;o<restArray.length;o++)o%7==0?(0!=o&&(i+=sevenbitdefault[binToInt(restArray[o-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;"+restArray[o-1]+"</span>&nbsp;</td>",c=c+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(restArray[o-1])]+"&nbsp;</td>",a++),i+=sevenbitdefault[binToInt(septetsArray[o])],g=g+"<td align=center width=75>&nbsp;"+septetsArray[o]+"&nbsp;</td>",c=c+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(septetsArray[o])]+"&nbsp;</td>",a++):(i+=sevenbitdefault[binToInt(septetsArray[o]+restArray[o-1])],g=g+"<td align=center width=75>&nbsp;"+septetsArray[o]+"<span style='background-color: #FFFF00'>"+restArray[o-1]+"&nbsp;</span></td>",c=c+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(septetsArray[o]+restArray[o-1])]+"&nbsp;</td>",a++);return a!=e?(i+=sevenbitdefault[binToInt(restArray[o-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;"+restArray[o-1]+"</span>&nbsp;</td>",c=c+"<td align=center width=75>&nbsp;"+sevenbitdefault[binToInt(restArray[o-1])]+"&nbsp;</td>"):(g+="<td align=center width=75>+++++++</td>",c+="<td align=center width=75>&nbsp;</td>"),calculation="Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+u+"</tr>"+b+"</tr></table>"+g+"</tr>"+c+"</tr></table>",i}function getUserMessage16(t,e){var r="";calculation="Not implemented";for(var s=0;s<t.length;s+=4){var n=t.substring(s,s+2),a=t.substring(s+2,s+4);r+=""+String.fromCharCode(256*HexToNum(n)+HexToNum(a))}return r}function getUserMessage8(t,e){var r="";calculation="Not implemented";for(var s=0;s<t.length;s+=2){var n=t.substring(s,s+2);r+=""+String.fromCharCode(HexToNum(n))}return r}function getPDUMetaInfo(t){var e=t,r=0,s="";if("AT"==e.substr(0,2))for(var n=0;n<e.length;n++)if(10==e.charCodeAt(n)){e=e.substr(n+1);break}for(var a="",n=0;n<e.length;n++)16!=MakeNum(e.substr(n,1))&&(a+=e.substr(n,1));e=a;var i=HexToNum(e.substring(0,2)),u=e.substring(2,2+2*i),b=u.substring(0,2),g=u.substring(2,2+2*i);0!=i&&(g=semiOctetToString(g),("F"==g.substr(g.length-1,1)||"f"==g.substr(g.length-1,1))&&(g=g.substring(0,g.length-1)),91==b&&(g="+"+g));var c=2*i+2;r=c;var o=e.substr(r,2);r+=2,32==(32&HexToNum(o))&&(s+="Receipt requested");var l=0;if(64==(64&HexToNum(o))&&(l=1,s+="Data Header"),1==(3&HexToNum(o))||3==(3&HexToNum(o))){3==(3&HexToNum(o))&&(s="Unknown Message");var d=HexToNum(e.substr(r,2));r+=2;var p=HexToNum(e.substr(r,2));p%2!=0&&(p+=1),r+=2;var h=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+p));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v),r+=p;var f=e.substr(r,2);r+=2;var m=e.substr(r,2),T=tpDCSMeaning(m);r+=2;var A;switch(24&HexToNum(o)){case 0:A="Not Present";break;case 16:A="Rel "+cValid(HexToNum(e.substr(r,2))),r+=2;break;case 8:A="Enhanced - Not Decoded",r+=14;break;case 24:A="Absolute - Not Decoded",r+=14}var y=HexToNum(e.substr(r,2));r+=2;var N=DCS_Bits(m),w="Undefined format";7==N?w=getUserMessage(e.substr(r,e.length-r),y):8==N?w=getUserMessage8(e.substr(r,e.length-r),y):16==N&&(w=getUserMessage16(e.substr(r,e.length-r),y)),w=w.substr(0,y),16==N&&(y/=2),s=JSON.stringify({mtype:s,smsc:g,number:v,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y})}else if(0==(3&HexToNum(o))){var p=HexToNum(e.substr(r,2));r+=2;var h=e.substr(r,2);r+=2;var v;"D0"==h?(_sl=p,p%2!=0&&(p+=1),v=getUserMessage(e.substring(r,r+p),parseInt(_sl/2*8/7))):(p%2!=0&&(p+=1),v=semiOctetToString(e.substring(r,r+p)),("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v)),r+=p;var f=e.substr(r,2);r+=2;var m=e.substr(r,2),T=tpDCSMeaning(m);r+=2;var x=semiOctetToString(e.substr(r,14)),H=x.substring(0,2),M=x.substring(2,4),k=x.substring(4,6),S=x.substring(6,8),F=x.substring(8,10),C=x.substring(10,12);x=k+"/"+M+"/"+H+" "+S+":"+F+":"+C+" GMT ?",r+=14;var y=HexToNum(e.substr(r,2));r+=2;var N=DCS_Bits(m),w="Undefined format";7==N?w=getUserMessage(e.substr(r,e.length-r),y):8==N?w=getUserMessage8(e.substr(r,e.length-r),y):16==N&&(w=getUserMessage16(e.substr(r,e.length-r),y)),w=w.substr(0,y),16==N&&(y/=2),s=JSON.stringify({mtype:s||"Receive message",smsc:g,number:v,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y,receipt_at:x})}else{s="Status Report";var d=HexToNum(e.substr(r,2));r+=2;var p=HexToNum(e.substr(r,2));p%2!=0&&(p+=1),r+=2;var h=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+p));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v),r+=p;var x=semiOctetToString(e.substr(r,14)),H=x.substring(0,2),M=x.substring(2,4),k=x.substring(4,6),S=x.substring(6,8),F=x.substring(8,10),C=x.substring(10,12),I=x.substring(12,14);x=k+"/"+M+"/"+H+" "+S+":"+F+":"+C+" GMT +"+I/4,r+=14;var D=semiOctetToString(e.substr(r,14)),U=D.substring(0,2),_=D.substring(2,4),B=D.substring(4,6),O=D.substring(6,8),E=D.substring(8,10),R=D.substring(10,12),j=x.substring(12,14);D=B+"/"+_+"/"+U+" "+O+":"+E+":"+R+" GMT +"+j/4,r+=14;var J=e.substr(r,2);s=JSON.stringify({mtype:s,smsc:g,number:v,sms_id:d,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y,sent_at:x,receipt_at:D,status:J})}return s}function stringToPDU(t,e,r,s,n,a,i,u){var b=s,g="",c="",o="",l=0,d=0,p="",h="";0!=r&&(p="81","+"==r.substr(0,1)?(p="91",r=r.substr(1)):"0"!=r.substr(0,1)&&(p="91"),r.length%2!=0&&(r+="F"),h=semiOctetToString(r),l=(p+""+h).length/2,d=l),10>l&&(l="0"+l);var v;v=i?u?"3100":"2100":u?"1100":"0100";var f="81";"+"==e.substr(0,1)?(f="91",e=e.substr(1)):"0"!=e.substr(0,1)&&(f="91");var m=intToHex(e.length);e.length%2!=0&&(e+="F");var T=semiOctetToString(e),A="00",y=0;switch(-1!=n&&(y=16|n),b){case 7:break;case 8:y=4|y;break;case 16:y=8|y}var N=intToHex(y),w="";u&&(w=intToHex(a));var x;if(7==b){x=intToHex(t.length);for(var H=0;H<=t.length;H++){if(H==t.length){""!=c&&(o=o+""+intToHex(binToInt(c)));break}var M,k=intToBin(getSevenBit(t.charAt(H)),7);0!=H&&H%8!=0?(g=k.substring(7-H%8),M=g+c,o=o+""+intToHex(binToInt(M)),c=k.substring(0,7-H%8)):c=k.substring(0,7-H%8)}}else if(8==b){x=intToHex(t.length);for(var S=0,H=0;H<t.length;H++)S=getEightBit(t.charCodeAt(H)),o=o+""+ToHex(S)}else if(16==b){x=intToHex(2*t.length);for(var F=0,H=0;H<t.length;H++)F=get16Bit(t.charCodeAt(H)),o=o+""+ToHex((65280&F)>>8)+ToHex(255&F)}var C=l+p+h+v+m+f+T+A+N+w+x,I=C+o,D=I.length/2-d-1;return JSON.stringify({size:D,pdu:I})}function DCS_Bits(t){var e=7,r=HexToNum(t);switch(192&r){case 0:switch(12&r){case 4:e=8;break;case 8:e=16}break;case 192:switch(48&r){case 32:e=16;break;case 48:4&r||(e=8)}}return e}function tpDCSMeaning(t){var e=t,r=HexToNum(t);switch(192&r){case 0:if(e=32&r?"Compressed Text\n":"Uncompressed Text\n",16&r)switch(e+="class:",3&r){case 0:e+="0\n";break;case 1:e+="1\n";break;case 2:e+="2\n";break;case 3:e+="3\n"}else e+="class: No class\n";switch(e+="Alphabet:",12&r){case 0:e+="Default\n";break;case 4:e+="8bit\n";break;case 8:e+="UCS2(16)bit\n";break;case 12:e+="Reserved\n"}break;case 64:case 128:e="Reserved coding group\n";break;case 192:switch(48&r){case 0:e="Message waiting group\n",e+="Discard\n";break;case 16:e="Message waiting group\n",e+="Store Message. Default Alphabet\n";break;case 32:e="Message waiting group\n",e+="Store Message. UCS2 Alphabet\n";break;case 48:e="Data coding message class\n",e+=4&r?"Default Alphabet\n":"8 bit Alphabet\n"}}return e}function Validity(t){return isNaN(parseInt(t))?t=0:(t=parseInt(t),0>t&&(t=0),t>255&&(t=255)),cValid(t)}function cValid(t){var e,r="";t=parseInt(t),143>=t?e=5*(t+1):167>=t?(e=(t-143)/2+12,e*=60):196>=t?(e=t-166,e*=1440):(e=t-192,e*=10080);var s,n,a,i;return s=e%60,n=e/60,a=n/24,i=a/7,n%=24,a%=7,0!=parseInt(i)&&(r+=parseInt(i)+"w "),0!=parseInt(a)&&(r+=parseInt(a)+"d "),0!=parseInt(n)&&(r+=parseInt(n)+"h "),0!=s&&(r+=s+"m "),r}sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","¡","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","Ä","Ö","Ñ","Ü","§","¿","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ä","ö","ñ","ü","à");var calculation="",maxkeys=160,alerted=!1;
@@ -0,0 +1,809 @@
1
+ /* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
2
+ *
3
+ * Further fixes and functionality by Andrew Alexander:
4
+ * Fix message length issues, handle +xx & 0xx phone codes, added bit length options,
5
+ * display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex,
6
+ * allow leading AT command in input, implemented some support for alpanumeric senders...
7
+ *
8
+ * ekkebus[at]cs.utwente.nl
9
+ * Feel free to use it, please don't forget to link to the source ;)
10
+ *
11
+ *
12
+ * www.rednaxela.net - Feel free to use this code as you wish.
13
+ * Version 1.5 r9aja
14
+ *
15
+ * Official BPS develop tool
16
+ *
17
+ * (c) BPS & co, 2003
18
+ */
19
+ //Array with "The 7 bit defaultalphabet"
20
+ sevenbitdefault = new Array('@', '£', '$', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', '\n', 'Ø', 'ø', '\r', 'Å', 'å', '\u0394', '_', '\u03a6', '\u0393', '\u039b', '\u03a9', '\u03a0', '\u03a8', '\u03a3', '\u0398', '\u039e', '€', 'Æ', 'æ', 'ß', 'É', ' ', '!', '"', '#', '¤', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '¡', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ä', 'Ö', 'Ñ', 'Ü', '§', '¿', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ä', 'ö', 'ñ', 'ü', 'à');
21
+ // Variable that stores the information to show the user the calculation of the translation
22
+ var calculation = "";
23
+ var maxkeys = 160;
24
+ var alerted = false;
25
+ // function te convert a bit string into a integer
26
+ function binToInt(x) //sp
27
+ {
28
+ var total = 0;
29
+ var power = parseInt(x.length) - 1;
30
+ for (var i = 0; i < x.length; i++) {
31
+ if (x.charAt(i) == '1') {
32
+ total = total + Math.pow(2, power);
33
+ }
34
+ power--;
35
+ }
36
+ return total;
37
+ }
38
+ // function to convert a integer into a bit String
39
+ function intToBin(x, size) //sp
40
+ {
41
+ var base = 2;
42
+ var num = parseInt(x);
43
+ var bin = num.toString(base);
44
+ for (var i = bin.length; i < size; i++) {
45
+ bin = "0" + bin;
46
+ }
47
+ return bin;
48
+ }
49
+ // function to convert a Hexnumber into a 10base number
50
+ function HexToNum(numberS) {
51
+ var tens = MakeNum(numberS.substring(0, 1));
52
+ var ones = 0;
53
+ if (numberS.length > 1) // means two characters entered
54
+ ones = MakeNum(numberS.substring(1, 2));
55
+ if (ones == 'X') {
56
+ return "00";
57
+ }
58
+ return (tens * 16) + (ones * 1);
59
+ }
60
+ // helper function for HexToNum
61
+ function MakeNum(str) {
62
+ if ((str >= '0') && (str <= '9'))
63
+ return str;
64
+ switch (str.toUpperCase()) {
65
+ case "A":
66
+ return 10;
67
+ case "B":
68
+ return 11;
69
+ case "C":
70
+ return 12;
71
+ case "D":
72
+ return 13;
73
+ case "E":
74
+ return 14;
75
+ case "F":
76
+ return 15;
77
+ default:
78
+ return 16;
79
+ }
80
+ return 16;
81
+ }
82
+ //function to convert integer to Hex
83
+ function intToHex(i) //sp
84
+ {
85
+ var sHex = "0123456789ABCDEF";
86
+ h = "";
87
+ i = parseInt(i);
88
+ for (j = 0; j <= 3; j++) {
89
+ h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
90
+ sHex.charAt((i >> (j * 8)) & 0x0F);
91
+ }
92
+ return h.substring(0, 2);
93
+ }
94
+
95
+ function ToHex(i) {
96
+ var sHex = "0123456789ABCDEF";
97
+ var Out = "";
98
+ Out = sHex.charAt(i & 0xf);
99
+ i >>= 4;
100
+ Out = sHex.charAt(i & 0xf) + Out;
101
+ return Out;
102
+ }
103
+
104
+ function getSevenBit(character) //sp
105
+ {
106
+ for (var i = 0; i < sevenbitdefault.length; i++) {
107
+ if (sevenbitdefault[i] == character) {
108
+ return i;
109
+ }
110
+ }
111
+ return 0;
112
+ }
113
+
114
+ function getEightBit(character) {
115
+ return character;
116
+ }
117
+
118
+ function get16Bit(character) {
119
+ return character;
120
+ }
121
+
122
+ function phoneNumberMap(character) {
123
+ // return character;
124
+ if ((character >= '0') && (character <= '9')) {
125
+ return character;
126
+ }
127
+ switch (character.toUpperCase()) {
128
+ case '*':
129
+ return 'A';
130
+ case '#':
131
+ return 'B';
132
+ case 'A':
133
+ return 'C';
134
+ case 'B':
135
+ return 'D';
136
+ case 'C':
137
+ return 'E';
138
+ // case '+':
139
+ // return '+'; // An exception to fit with current processing ...
140
+ default:
141
+ return 'F';
142
+ }
143
+ return 'F';
144
+ }
145
+
146
+ function phoneNumberUnMap(chararacter) {
147
+ if ((chararacter >= '0') && (chararacter <= '9')) {
148
+ return chararacter;
149
+ }
150
+ switch (chararacter) {
151
+ case 10:
152
+ return '*';
153
+ case 11:
154
+ return '#';
155
+ case 12:
156
+ return 'A';
157
+ case 13:
158
+ return 'B';
159
+ case 14:
160
+ return 'C';
161
+ default:
162
+ return 'F';
163
+ }
164
+ return 'F';
165
+ }
166
+ // function to convert semioctets to a string
167
+ function semiOctetToString(inp) //sp
168
+ {
169
+ var out = "";
170
+ for (var i = 0; i < inp.length; i = i + 2) {
171
+ var temp = inp.substring(i, i + 2);
172
+ out = out + phoneNumberMap(temp.charAt(1)) + phoneNumberMap(temp.charAt(0));
173
+ }
174
+ return out;
175
+ }
176
+ //Main function to translate the input to a "human readable" string
177
+ function getUserMessage(input, truelength) // Add truelength AJA
178
+ {
179
+ var byteString = "";
180
+ octetArray = new Array();
181
+ restArray = new Array();
182
+ septetsArray = new Array();
183
+ var s = 1;
184
+ var count = 0;
185
+ var matchcount = 0; // AJA
186
+ var smsMessage = "";
187
+ var calculation1 = "<table border=1 ><tr><td align=center width=75><b>Hex</b></td>";
188
+ var calculation2 = "<tr><td align=center width=75> <b>&nbsp;&nbsp;&nbsp;Octets&nbsp;&nbsp;&nbsp;</b></td>";
189
+ var calculation3 = "<table border=1 ><tr><td align=center width=75><b>septets</b></td>";
190
+ var calculation4 = "<tr><td align=center width=75><b>Character</b></td>";
191
+ calculation = "";
192
+ //Cut the input string into pieces of2 (just get the hex octets)
193
+ for (var i = 0; i < input.length; i = i + 2) {
194
+ var hex = input.substring(i, i + 2);
195
+ byteString = byteString + intToBin(HexToNum(hex), 8);
196
+ if ((i % 14 == 0 && i != 0)) {
197
+ calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
198
+ }
199
+ calculation1 = calculation1 + "<td align=center width=75>" + hex + "</td>";
200
+ }
201
+ calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
202
+ // make two array's these are nessesery to
203
+ for (var i = 0; i < byteString.length; i = i + 8) {
204
+ octetArray[count] = byteString.substring(i, i + 8);
205
+ restArray[count] = octetArray[count].substring(0, (s % 8));
206
+ septetsArray[count] = octetArray[count].substring((s % 8), 8);
207
+ if ((i % 56 == 0 && i != 0)) {
208
+ calculation2 = calculation2 + "<td align=center width=75>&nbsp;</td>";
209
+ }
210
+ calculation2 = calculation2 + "<td align=center width=75><span style='background-color: #FFFF00'>" + restArray[count] + "</span>" + septetsArray[count] + "</td>";
211
+ s++;
212
+ count++;
213
+ if (s == 8) {
214
+ s = 1;
215
+ }
216
+ }
217
+ calculation2 = calculation2 + "<td align=center width=75>&nbsp;</td>";
218
+ // put the right parts of the array's together to make the sectets
219
+ for (var i = 0; i < restArray.length; i++) {
220
+ if (i % 7 == 0) {
221
+ if (i != 0) {
222
+ smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])];
223
+ calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;" + restArray[i - 1] + "</span>&nbsp;</td>";
224
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(restArray[i - 1])] + "&nbsp;</td>";
225
+ matchcount++; // AJA
226
+ }
227
+ smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i])];
228
+ calculation3 = calculation3 + "<td align=center width=75>&nbsp;" + septetsArray[i] + "&nbsp;</td>";
229
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(septetsArray[i])] + "&nbsp;</td>";
230
+ matchcount++; // AJA
231
+ } else {
232
+ smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])];
233
+ calculation3 = calculation3 + "<td align=center width=75>&nbsp;" + septetsArray[i] + "<span style='background-color: #FFFF00'>" + restArray[i - 1] + "&nbsp;</span>" + "</td>"
234
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])] + "&nbsp;</td>";
235
+ matchcount++; // AJA
236
+ }
237
+ }
238
+ if (matchcount != truelength) // Don't forget trailing characters!! AJA
239
+ {
240
+ smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])];
241
+ calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'>&nbsp;" + restArray[i - 1] + "</span>&nbsp;</td>";
242
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(restArray[i - 1])] + "&nbsp;</td>";
243
+ } else // Blank Filler
244
+ {
245
+ calculation3 = calculation3 + "<td align=center width=75>+++++++</td>";
246
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;</td>";
247
+ }
248
+ //Put all the calculation info together
249
+ calculation = "Conversion of 8-bit octets to 7-bit default alphabet<br><br>" + calculation1 + "</tr>" + calculation2 + "</tr></table>" + calculation3 + "</tr>" + calculation4 + "</tr></table>";
250
+ return smsMessage;
251
+ }
252
+
253
+ function getUserMessage16(input, truelength) {
254
+ var smsMessage = "";
255
+ calculation = "Not implemented";
256
+ // Cut the input string into pieces of 4
257
+ for (var i = 0; i < input.length; i = i + 4) {
258
+ var hex1 = input.substring(i, i + 2);
259
+ var hex2 = input.substring(i + 2, i + 4);
260
+ smsMessage += "" + String.fromCharCode(HexToNum(hex1) * 256 + HexToNum(hex2));
261
+ }
262
+ return smsMessage;
263
+ }
264
+
265
+ function getUserMessage8(input, truelength) {
266
+ var smsMessage = "";
267
+ calculation = "Not implemented";
268
+ // Cut the input string into pieces of 2 (just get the hex octets)
269
+ for (var i = 0; i < input.length; i = i + 2) {
270
+ var hex = input.substring(i, i + 2);
271
+ smsMessage += "" + String.fromCharCode(HexToNum(hex));
272
+ }
273
+ return smsMessage;
274
+ }
275
+ // Function to get SMSmeta info information from PDU String
276
+ function getPDUMetaInfo(inp) {
277
+ var PDUString = inp;
278
+ var start = 0;
279
+ var out = "";
280
+ // Silently Strip leading AT command
281
+ if (PDUString.substr(0, 2) == "AT") {
282
+ for (var i = 0; i < PDUString.length; i++) {
283
+ if (PDUString.charCodeAt(i) == 10) {
284
+ PDUString = PDUString.substr(i + 1);
285
+ break;
286
+ }
287
+ }
288
+ }
289
+ // Silently strip whitespace
290
+ var NewPDU = "";
291
+ for (var i = 0; i < PDUString.length; i++) {
292
+ if (MakeNum(PDUString.substr(i, 1)) != 16) {
293
+ NewPDU = NewPDU + PDUString.substr(i, 1);
294
+ }
295
+ }
296
+ PDUString = NewPDU;
297
+ var SMSC_lengthInfo = HexToNum(PDUString.substring(0, 2));
298
+ var SMSC_info = PDUString.substring(2, 2 + (SMSC_lengthInfo * 2));
299
+ var SMSC_TypeOfAddress = SMSC_info.substring(0, 2);
300
+ var SMSC_Number = SMSC_info.substring(2, 2 + (SMSC_lengthInfo * 2));
301
+ if (SMSC_lengthInfo != 0) {
302
+ SMSC_Number = semiOctetToString(SMSC_Number);
303
+ // if the length is odd remove the trailing F
304
+ if ((SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'F') || (SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'f')) {
305
+ SMSC_Number = SMSC_Number.substring(0, SMSC_Number.length - 1);
306
+ }
307
+ if (SMSC_TypeOfAddress == 91) {
308
+ SMSC_Number = "+" + SMSC_Number;
309
+ }
310
+ }
311
+ var start_SMSDeleivery = (SMSC_lengthInfo * 2) + 2;
312
+ start = start_SMSDeleivery;
313
+ var firstOctet_SMSDeliver = PDUString.substr(start, 2);
314
+ start = start + 2;
315
+ if ((HexToNum(firstOctet_SMSDeliver) & 0x20) == 0x20) {
316
+ out += "Receipt requested";
317
+ }
318
+ var DataHeader = 0;
319
+ if ((HexToNum(firstOctet_SMSDeliver) & 0x40) == 0x40) {
320
+ DataHeader = 1;
321
+ out += "Data Header";
322
+ }
323
+ // bit1 bit0 Message type
324
+ // 0 0 SMS DELIVER (in the direction SC to MS)
325
+ // 0 0 SMS DELIVER REPORT (in the direction MS to SC)
326
+ // 1 0 SMS STATUS REPORT (in the direction SC to MS)
327
+ // 1 0 SMS COMMAND (in the direction MS to SC)
328
+ // 0 1 SMS SUBMIT (in the direction MS to SC)
329
+ // 0 1 SMS SUBMIT REPORT (in the direction SC to MS)
330
+ // 1 1 Reserved
331
+ // This needs tidying up!! AJA
332
+ if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 1 || (HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) // Transmit Message
333
+ {
334
+ if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) {
335
+ out = "Unknown Message"; //Treat as Deliver
336
+ }
337
+ var MessageReference = HexToNum(PDUString.substr(start, 2));
338
+ start = start + 2;
339
+ // length in decimals
340
+ var sender_addressLength = HexToNum(PDUString.substr(start, 2));
341
+ if (sender_addressLength % 2 != 0) {
342
+ sender_addressLength += 1;
343
+ }
344
+ start = start + 2;
345
+ var sender_typeOfAddress = PDUString.substr(start, 2);
346
+ start = start + 2
347
+ var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
348
+ if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
349
+ sender_number = sender_number.substring(0, sender_number.length - 1);
350
+ }
351
+ if (sender_typeOfAddress == 91) {
352
+ sender_number = "+" + sender_number;
353
+ }
354
+ start += sender_addressLength;
355
+ var tp_PID = PDUString.substr(start, 2);
356
+ start += 2;
357
+ var tp_DCS = PDUString.substr(start, 2);
358
+ var tp_DCS_desc = tpDCSMeaning(tp_DCS);
359
+ start += 2;
360
+ var ValidityPeriod;
361
+ switch ((HexToNum(firstOctet_SMSDeliver) & 0x18)) {
362
+ case 0: // Not Present
363
+ ValidityPeriod = "Not Present";
364
+ break;
365
+ case 0x10: // Relative
366
+ ValidityPeriod = "Rel " + cValid(HexToNum(PDUString.substr(start, 2)));
367
+ start += 2;
368
+ break;
369
+ case 0x08: // Enhanced
370
+ ValidityPeriod = "Enhanced - Not Decoded";
371
+ start += 14;
372
+ break;
373
+ case 0x18: // Absolute
374
+ ValidityPeriod = "Absolute - Not Decoded";
375
+ start += 14;
376
+ break;
377
+ }
378
+ // Commonish...
379
+ var messageLength = HexToNum(PDUString.substr(start, 2));
380
+ start += 2;
381
+ var bitSize = DCS_Bits(tp_DCS);
382
+ var userData = "Undefined format";
383
+ if (bitSize == 7) {
384
+ userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength);
385
+ } else if (bitSize == 8) {
386
+ userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength);
387
+ } else if (bitSize == 16) {
388
+ userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength);
389
+ }
390
+ userData = userData.substr(0, messageLength);
391
+ if (bitSize == 16) {
392
+ messageLength /= 2;
393
+ }
394
+
395
+ out = JSON.stringify({mtype: out, smsc: SMSC_Number, number: sender_number, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength});
396
+ //out += "SMSC#" + SMSC_Number + "\nReceipient:" + sender_number + "\nValidity:" + ValidityPeriod + "\nTP_PID:" + tp_PID + "\nTP_DCS:" + tp_DCS + "\nTP_DCS-popis:" + tp_DCS_desc + "\nMessage:" + userData + "\nLength:" + messageLength;
397
+ } else // Receive Message
398
+ if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 0) // Receive Message
399
+ {
400
+ //out = "Receive Message\n";
401
+ // length in decimals
402
+ var sender_addressLength = HexToNum(PDUString.substr(start, 2));
403
+ start = start + 2;
404
+ var sender_typeOfAddress = PDUString.substr(start, 2);
405
+ start = start + 2
406
+ var sender_number;
407
+ if (sender_typeOfAddress == "D0") {
408
+ _sl = sender_addressLength;
409
+ if (sender_addressLength % 2 != 0) {
410
+ sender_addressLength += 1;
411
+ }
412
+ sender_number = getUserMessage(PDUString.substring(start, start + sender_addressLength), parseInt(_sl / 2 * 8 / 7));
413
+ } else {
414
+ if (sender_addressLength % 2 != 0) {
415
+ sender_addressLength += 1;
416
+ }
417
+ sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
418
+ if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
419
+ sender_number = sender_number.substring(0, sender_number.length - 1);
420
+ }
421
+ if (sender_typeOfAddress == 91) {
422
+ sender_number = "+" + sender_number;
423
+ }
424
+ }
425
+ start += sender_addressLength;
426
+ var tp_PID = PDUString.substr(start, 2);
427
+ start += 2;
428
+ var tp_DCS = PDUString.substr(start, 2);
429
+ var tp_DCS_desc = tpDCSMeaning(tp_DCS);
430
+ start += 2;
431
+ var timeStamp = semiOctetToString(PDUString.substr(start, 14));
432
+ // get date
433
+ var year = timeStamp.substring(0, 2);
434
+ var month = timeStamp.substring(2, 4);
435
+ var day = timeStamp.substring(4, 6);
436
+ var hours = timeStamp.substring(6, 8);
437
+ var minutes = timeStamp.substring(8, 10);
438
+ var seconds = timeStamp.substring(10, 12);
439
+ timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT ?"; //+" + timezone/4;
440
+ start += 14;
441
+ // Commonish...
442
+ var messageLength = HexToNum(PDUString.substr(start, 2));
443
+ start += 2;
444
+ var bitSize = DCS_Bits(tp_DCS);
445
+ var userData = "Undefined format";
446
+ if (bitSize == 7) {
447
+ userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength);
448
+ } else if (bitSize == 8) {
449
+ userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength);
450
+ } else if (bitSize == 16) {
451
+ userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength);
452
+ }
453
+ userData = userData.substr(0, messageLength);
454
+ if (bitSize == 16) {
455
+ messageLength /= 2;
456
+ }
457
+ out = JSON.stringify({mtype: out || "Receive message", smsc: SMSC_Number, number: sender_number, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength, receipt_at: timeStamp});
458
+ //out += "SMSC#" + SMSC_Number + "\nSender:" + sender_number + "\nTimeStamp:" + timeStamp + "\nTP_PID:" + tp_PID + "\nTP_DCS:" + tp_DCS + "\nTP_DCS-popis:" + tp_DCS_desc + "\nMessage:" + userData + "\nLength:" + messageLength;
459
+ } else {
460
+ out = "Status Report";
461
+ var MessageReference = HexToNum(PDUString.substr(start, 2)); // ??? Correct this name
462
+ start = start + 2;
463
+ // length in decimals
464
+ var sender_addressLength = HexToNum(PDUString.substr(start, 2));
465
+ if (sender_addressLength % 2 != 0) {
466
+ sender_addressLength += 1;
467
+ }
468
+ start = start + 2;
469
+ var sender_typeOfAddress = PDUString.substr(start, 2);
470
+ start = start + 2
471
+ var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
472
+ if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
473
+ sender_number = sender_number.substring(0, sender_number.length - 1);
474
+ }
475
+ if (sender_typeOfAddress == 91) {
476
+ sender_number = "+" + sender_number;
477
+ }
478
+ start += sender_addressLength;
479
+ var timeStamp = semiOctetToString(PDUString.substr(start, 14));
480
+ // get date
481
+ var year = timeStamp.substring(0, 2);
482
+ var month = timeStamp.substring(2, 4);
483
+ var day = timeStamp.substring(4, 6);
484
+ var hours = timeStamp.substring(6, 8);
485
+ var minutes = timeStamp.substring(8, 10);
486
+ var seconds = timeStamp.substring(10, 12);
487
+ var timezone = timeStamp.substring(12, 14);
488
+ timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT +" + timezone / 4;
489
+ start += 14;
490
+ var timeStamp2 = semiOctetToString(PDUString.substr(start, 14));
491
+ // get date
492
+ var year2 = timeStamp2.substring(0, 2);
493
+ var month2 = timeStamp2.substring(2, 4);
494
+ var day2 = timeStamp2.substring(4, 6);
495
+ var hours2 = timeStamp2.substring(6, 8);
496
+ var minutes2 = timeStamp2.substring(8, 10);
497
+ var seconds2 = timeStamp2.substring(10, 12);
498
+ var timezone2 = timeStamp.substring(12, 14);
499
+ timeStamp2 = day2 + "/" + month2 + "/" + year2 + " " + hours2 + ":" + minutes2 + ":" + seconds2 + " GMT +" + timezone2 / 4;
500
+ start += 14;
501
+ var mStatus = PDUString.substr(start, 2);
502
+ //out += "SMSC#\n" + SMSC_Number + "\nSender:\n" + sender_number + "\nMessage Ref#:\n" + MessageReference + "\nTimeStamp:\n" + timeStamp + "\nTimeStamp2:\n" + timeStamp2 + "\nStatus Byte: " + mStatus;
503
+ out = JSON.stringify({mtype: out, smsc: SMSC_Number, number: sender_number, sms_id: MessageReference, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength, sent_at: timeStamp, receipt_at: timeStamp2, status: mStatus});
504
+ }
505
+ return out;
506
+ }
507
+
508
+ function stringToPDU(inpString, phoneNumber, smscNumber, size, mclass, valid, receipt, vFlag) // AJA fixed SMSC processing
509
+ {
510
+ var bitSize = size;
511
+ var octetFirst = "";
512
+ var octetSecond = "";
513
+ var output = "";
514
+ //Make header
515
+ var SMSC_INFO_LENGTH = 0;
516
+ var SMSC_LENGTH = 0;
517
+ var SMSC_NUMBER_FORMAT = "";
518
+ var SMSC = "";
519
+ if (smscNumber != 0) {
520
+ SMSC_NUMBER_FORMAT = "81"; // national
521
+ if (smscNumber.substr(0, 1) == '+') {
522
+ SMSC_NUMBER_FORMAT = "91"; // international
523
+ smscNumber = smscNumber.substr(1);
524
+ } else if (smscNumber.substr(0, 1) != '0') {
525
+ SMSC_NUMBER_FORMAT = "91"; // international
526
+ }
527
+ if (smscNumber.length % 2 != 0) {
528
+ // add trailing F
529
+ smscNumber += "F";
530
+ }
531
+ SMSC = semiOctetToString(smscNumber);
532
+ SMSC_INFO_LENGTH = ((SMSC_NUMBER_FORMAT + "" + SMSC).length) / 2;
533
+ SMSC_LENGTH = SMSC_INFO_LENGTH;
534
+ }
535
+ if (SMSC_INFO_LENGTH < 10) {
536
+ SMSC_INFO_LENGTH = "0" + SMSC_INFO_LENGTH;
537
+ }
538
+ var firstOctet; // = "1100";
539
+ if (receipt) {
540
+ if (vFlag) {
541
+ firstOctet = "3100"; // 18 is mask for validity period // 10 indicates relative
542
+ } else {
543
+ firstOctet = "2100";
544
+ }
545
+ } else {
546
+ if (vFlag) {
547
+ firstOctet = "1100";
548
+ } else {
549
+ firstOctet = "0100";
550
+ }
551
+ }
552
+ var REIVER_NUMBER_FORMAT = "81"; // national
553
+ if (phoneNumber.substr(0, 1) == '+') {
554
+ REIVER_NUMBER_FORMAT = "91"; // international
555
+ phoneNumber = phoneNumber.substr(1); //,phoneNumber.length-1);
556
+ } else if (phoneNumber.substr(0, 1) != '0') {
557
+ REIVER_NUMBER_FORMAT = "91"; // international
558
+ }
559
+ var REIVER_NUMBER_LENGTH = intToHex(phoneNumber.length);
560
+ if (phoneNumber.length % 2 != 0) {
561
+ // add trailing F
562
+ phoneNumber += "F";
563
+ }
564
+ var REIVER_NUMBER = semiOctetToString(phoneNumber);
565
+ var PROTO_ID = "00";
566
+ var DCS = 0;
567
+ if (mclass != -1) // AJA
568
+ {
569
+ DCS = mclass | 0x10;
570
+ }
571
+ switch (bitSize) {
572
+ case 7:
573
+ break;
574
+ case 8:
575
+ DCS = DCS | 4;
576
+ break;
577
+ case 16:
578
+ DCS = DCS | 8;
579
+ break;
580
+ }
581
+ var DATA_ENCODING = intToHex(DCS);
582
+ // var DATA_ENCODING = "00"; // Default
583
+ // if (bitSize == 8)
584
+ // {
585
+ // DATA_ENCODING = "04";
586
+ // }
587
+ // else if (bitSize == 16)
588
+ // {
589
+ // DATA_ENCODING = "08";
590
+ // }
591
+ var VALID_PERIOD = ""; // AA
592
+ if (vFlag) {
593
+ VALID_PERIOD = intToHex(valid); // AA
594
+ }
595
+ var userDataSize;
596
+ if (bitSize == 7) {
597
+ userDataSize = intToHex(inpString.length);
598
+ for (var i = 0; i <= inpString.length; i++) {
599
+ if (i == inpString.length) {
600
+ if (octetSecond != "") // AJA Fix overshoot
601
+ {
602
+ output = output + "" + (intToHex(binToInt(octetSecond)));
603
+ }
604
+ break;
605
+ }
606
+ var current = intToBin(getSevenBit(inpString.charAt(i)), 7);
607
+ var currentOctet;
608
+ if (i != 0 && i % 8 != 0) {
609
+ octetFirst = current.substring(7 - (i) % 8);
610
+ currentOctet = octetFirst + octetSecond; //put octet parts together
611
+ output = output + "" + (intToHex(binToInt(currentOctet)));
612
+ octetSecond = current.substring(0, 7 - (i) % 8); //set net second octet
613
+ } else {
614
+ octetSecond = current.substring(0, 7 - (i) % 8);
615
+ }
616
+ }
617
+ } else if (bitSize == 8) {
618
+ userDataSize = intToHex(inpString.length);
619
+ var CurrentByte = 0;
620
+ for (var i = 0; i < inpString.length; i++) {
621
+ CurrentByte = getEightBit(inpString.charCodeAt(i));
622
+ output = output + "" + (ToHex(CurrentByte));
623
+ }
624
+ } else if (bitSize == 16) {
625
+ userDataSize = intToHex(inpString.length * 2);
626
+ var myChar = 0;
627
+ for (var i = 0; i < inpString.length; i++) {
628
+ myChar = get16Bit(inpString.charCodeAt(i));
629
+ output = output + "" + (ToHex((myChar & 0xff00) >> 8)) + (ToHex(myChar & 0xff));
630
+ }
631
+ }
632
+ var header = SMSC_INFO_LENGTH + SMSC_NUMBER_FORMAT + SMSC + firstOctet + REIVER_NUMBER_LENGTH + REIVER_NUMBER_FORMAT + REIVER_NUMBER + PROTO_ID + DATA_ENCODING + VALID_PERIOD + userDataSize;
633
+ var PDU = header + output;
634
+ var AT = (PDU.length / 2 - SMSC_LENGTH - 1); // Add /2 for PDU length AJA - I think the SMSC information should also be excluded
635
+ // var bStep=18;
636
+ // for(var breakUp=1;breakUp*bStep < PDU.length;breakUp++)
637
+ // {
638
+ // PDU = PDU.substr(0,breakUp*bStep+breakUp-1) + " " + PDU.substr(breakUp*bStep+breakUp-1);
639
+ // }
640
+ //CMGW
641
+ return JSON.stringify({size: AT, pdu: PDU});
642
+ }
643
+
644
+ function DCS_Bits(tp_DCS) {
645
+ var AlphabetSize = 7; // Set Default
646
+ var pomDCS = HexToNum(tp_DCS);
647
+ switch (pomDCS & 192) {
648
+ case 0:
649
+ if (pomDCS & 32) {
650
+ // tp_DCS_desc="Compressed Text\n";
651
+ } else {
652
+ // tp_DCS_desc="Uncompressed Text\n";
653
+ }
654
+ switch (pomDCS & 12) {
655
+ case 4:
656
+ AlphabetSize = 8;
657
+ break;
658
+ case 8:
659
+ AlphabetSize = 16;
660
+ break;
661
+ }
662
+ break;
663
+ case 192:
664
+ switch (pomDCS & 0x30) {
665
+ case 0x20:
666
+ AlphabetSize = 16;
667
+ break;
668
+ case 0x30:
669
+ if (pomDCS & 0x4) {;
670
+ } else {
671
+ AlphabetSize = 8;
672
+ }
673
+ break;
674
+ }
675
+ break;
676
+ }
677
+ return (AlphabetSize);
678
+ }
679
+
680
+ function tpDCSMeaning(tp_DCS) {
681
+ var tp_DCS_desc = tp_DCS;
682
+ var pomDCS = HexToNum(tp_DCS);
683
+ switch (pomDCS & 192) {
684
+ case 0:
685
+ if (pomDCS & 32) {
686
+ tp_DCS_desc = "Compressed Text\n";
687
+ } else {
688
+ tp_DCS_desc = "Uncompressed Text\n";
689
+ }
690
+ if (!(pomDCS & 16)) // AJA
691
+ {
692
+ tp_DCS_desc += "class: No class\n";
693
+ } else {
694
+ tp_DCS_desc += "class:";
695
+ switch (pomDCS & 3) {
696
+ case 0:
697
+ tp_DCS_desc += "0\n";
698
+ break;
699
+ case 1:
700
+ tp_DCS_desc += "1\n";
701
+ break;
702
+ case 2:
703
+ tp_DCS_desc += "2\n";
704
+ break;
705
+ case 3:
706
+ tp_DCS_desc += "3\n";
707
+ break;
708
+ }
709
+ }
710
+ tp_DCS_desc += "Alphabet:";
711
+ switch (pomDCS & 12) {
712
+ case 0:
713
+ tp_DCS_desc += "Default\n";
714
+ break;
715
+ case 4:
716
+ tp_DCS_desc += "8bit\n";
717
+ break;
718
+ case 8:
719
+ tp_DCS_desc += "UCS2(16)bit\n";
720
+ break;
721
+ case 12:
722
+ tp_DCS_desc += "Reserved\n";
723
+ break;
724
+ }
725
+ break;
726
+ case 64:
727
+ case 128:
728
+ tp_DCS_desc = "Reserved coding group\n";
729
+ break;
730
+ case 192:
731
+ switch (pomDCS & 0x30) {
732
+ case 0:
733
+ tp_DCS_desc = "Message waiting group\n";
734
+ tp_DCS_desc += "Discard\n";
735
+ break;
736
+ case 0x10:
737
+ tp_DCS_desc = "Message waiting group\n";
738
+ tp_DCS_desc += "Store Message. Default Alphabet\n";
739
+ break;
740
+ case 0x20:
741
+ tp_DCS_desc = "Message waiting group\n";
742
+ tp_DCS_desc += "Store Message. UCS2 Alphabet\n";
743
+ break;
744
+ case 0x30:
745
+ tp_DCS_desc = "Data coding message class\n";
746
+ if (pomDCS & 0x4) {
747
+ tp_DCS_desc += "Default Alphabet\n";
748
+ } else {
749
+ tp_DCS_desc += "8 bit Alphabet\n";
750
+ }
751
+ break;
752
+ }
753
+ break;
754
+ }
755
+ return (tp_DCS_desc);
756
+ }
757
+
758
+ function Validity(valid) {
759
+ var byValidityPeriod = 0;
760
+ if (isNaN(parseInt(valid))) {
761
+ valid = 0;
762
+ } else {
763
+ valid = parseInt(valid);
764
+ if (valid < 0) {
765
+ valid = 0;
766
+ }
767
+ if (valid > 255) {
768
+ valid = 255;
769
+ }
770
+ }
771
+ return cValid(valid);
772
+ }
773
+
774
+ function cValid(valid) {
775
+ var value, out = "";
776
+ valid = parseInt(valid);
777
+ if (valid <= 143) {
778
+ value = (valid + 1) * 5; // Minutes
779
+ } else if (valid <= 167) {
780
+ value = ((valid - 143) / 2 + 12); // Hours
781
+ value *= 60; // Convert to Minutes
782
+ } else if (valid <= 196) {
783
+ value = valid - 166; // days
784
+ value *= 60 * 24; // Convert to Minutes
785
+ } else {
786
+ value = valid - 192; // Weeks
787
+ value *= 7 * 60 * 24; // Convert to Minutes
788
+ }
789
+ var mins, hours, days, weeks;
790
+ mins = value % 60;
791
+ hours = value / 60;
792
+ days = hours / 24;
793
+ weeks = days / 7;
794
+ hours %= 24;
795
+ days %= 7;
796
+ if (parseInt(weeks) != 0) {
797
+ out += parseInt(weeks) + "w ";
798
+ }
799
+ if (parseInt(days) != 0) {
800
+ out += parseInt(days) + "d ";
801
+ }
802
+ if (parseInt(hours) != 0) {
803
+ out += parseInt(hours) + "h ";
804
+ }
805
+ if (mins != 0) {
806
+ out += mins + "m ";
807
+ }
808
+ return out;
809
+ }