/* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
* * Further fixes and functionality by Andrew Alexander: * Fix message length issues, handle +xx & 0xx phone codes, added bit length options, * display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex, * allow leading AT command in input, implemented some support for alpanumeric senders... * * ekkebus[at]cs.utwente.nl * Feel free to use it, please don't forget to link to the source ;) * * * www.rednaxela.net - Feel free to use this code as you wish. * Version 1.5 r9aja * * Official BPS develop tool * * (c) BPS & co, 2003 */
//Array with “The 7 bit defaultalphabet” 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', 'ä', 'ö', 'ñ', 'ü', 'à', 'á');
// Variable that stores the information to show the user the calculation of the translation var calculation = “”;
var maxkeys = 160; var alerted = false;
// function te convert a bit string into a integer function binToInt(x) //sp {
var total = 0; var power = parseInt(x.length) - 1; for (var i = 0; i < x.length; i++) { if (x.charAt(i) == '1') { total = total + Math.pow(2, power); } power--; } return total;
}
// function to convert a integer into a bit String function intToBin(x, size) //sp {
var base = 2; var num = parseInt(x); var bin = num.toString(base); for (var i = bin.length; i < size; i++) { bin = "0" + bin; } return bin;
}
// function to convert a Hexnumber into a 10base number function HexToNum(numberS) {
var tens = MakeNum(numberS.substring(0, 1)); var ones = 0; if (numberS.length > 1) // means two characters entered ones = MakeNum(numberS.substring(1, 2)); if (ones == 'X') { return "00"; } return (tens * 16) + (ones * 1);
}
// helper function for HexToNum function MakeNum(str) {
if ((str >= '0') && (str <= '9')) return str; switch (str.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 to convert integer to Hex
function intToHex(i) //sp {
var sHex = "0123456789ABCDEF"; h = ""; i = parseInt(i); for (j = 0; j <= 3; j++) { h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) + sHex.charAt((i >> (j * 8)) & 0x0F); } return h.substring(0, 2);
}
function ToHex(i) {
var sHex = "0123456789ABCDEF"; var Out = ""; Out = sHex.charAt(i & 0xf); i >>= 4; Out = sHex.charAt(i & 0xf) + Out; return Out;
}
function getSevenBit(character) //sp {
for (var i = 0; i < sevenbitdefault.length; i++) { if (sevenbitdefault[i] == character) { return i; } } //alert("No 7 bit char for " + character); return 0;
}
function getEightBit(character) {
return character;
}
function get16Bit(character) {
return character;
}
function phoneNumberMap(character) {
// return character; if ((character >= '0') && (character <= '9')) { return character; } switch (character.toUpperCase()) { case '*': return 'A'; case '#': return 'B'; case 'A': return 'C'; case 'B': return 'D'; case 'C': return 'E'; // case '+': // return '+'; // An exception to fit with current processing ... default: return 'F'; } return 'F';
}
function phoneNumberUnMap(chararacter) {
if ((chararacter >= '0') && (chararacter <= '9')) { return chararacter; } switch (chararacter) { case 10: return '*'; case 11: return '#'; case 12: return 'A'; case 13: return 'B'; case 14: return 'C'; default: return 'F'; } return 'F';
}
// function to convert semioctets to a string function semiOctetToString(inp) //sp {
var out = ""; for (var i = 0; i < inp.length; i = i + 2) { var temp = inp.substring(i, i + 2); out = out + phoneNumberMap(temp.charAt(1)) + phoneNumberMap(temp.charAt(0)); } return out;
}
//Main function to translate the input to a “human readable” string function getUserMessage(input, truelength) // Add truelength AJA {
var byteString = ""; octetArray = new Array(); restArray = new Array(); septetsArray = new Array(); var s = 1; var count = 0; var matchcount = 0; // AJA var smsMessage = ""; var calculation1 = "<table border=1 ><tr><td align=center width=75><b>Hex</b></td>"; var calculation2 = "<tr><td align=center width=75> <b> Octets </b></td>"; var calculation3 = "<table border=1 ><tr><td align=center width=75><b>septets</b></td>"; var calculation4 = "<tr><td align=center width=75><b>Character</b></td>"; calculation = ""; //Cut the input string into pieces of2 (just get the hex octets) for (var i = 0; i < input.length; i = i + 2) { var hex = input.substring(i, i + 2); byteString = byteString + intToBin(HexToNum(hex), 8); if ((i % 14 == 0 && i != 0)) { calculation1 = calculation1 + "<td align=center width=75>+++++++</td>"; } calculation1 = calculation1 + "<td align=center width=75>" + hex + "</td>"; } calculation1 = calculation1 + "<td align=center width=75>+++++++</td>"; // make two array's these are nessesery to for (var i = 0; i < byteString.length; i = i + 8) { octetArray[count] = byteString.substring(i, i + 8); restArray[count] = octetArray[count].substring(0, (s % 8)); septetsArray[count] = octetArray[count].substring((s % 8), 8); if ((i % 56 == 0 && i != 0)) { calculation2 = calculation2 + "<td align=center width=75> </td>"; } calculation2 = calculation2 + "<td align=center width=75><span style='background-color: #FFFF00'>" + restArray[count] + "</span>" + septetsArray[count] + "</td>"; s++; count++; if (s == 8) { s = 1; } } calculation2 = calculation2 + "<td align=center width=75> </td>"; // put the right parts of the array's together to make the sectets for (var i = 0; i < restArray.length; i++) { if (i % 7 == 0) { if (i != 0) { smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])]; calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i - 1] + "</span> </td>"; calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i - 1])] + " </td>"; matchcount++; // AJA } smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i])]; calculation3 = calculation3 + "<td align=center width=75> " + septetsArray[i] + " </td>"; calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i])] + " </td>"; matchcount++; // AJA } else { smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])]; calculation3 = calculation3 + "<td align=center width=75> " + septetsArray[i] + "<span style='background-color: #FFFF00'>" + restArray[i - 1] + " </span>" + "</td>" calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])] + " </td>"; matchcount++; // AJA } } if (matchcount != truelength) // Don't forget trailing characters!! AJA { smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])]; calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i - 1] + "</span> </td>"; calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i - 1])] + " </td>"; } else // Blank Filler { calculation3 = calculation3 + "<td align=center width=75>+++++++</td>"; calculation4 = calculation4 + "<td align=center width=75> </td>"; } //Put all the calculation info together calculation = "Conversion of 8-bit octets to 7-bit default alphabet<br><br>" + calculation1 + "</tr>" + calculation2 + "</tr></table>" + calculation3 + "</tr>" + calculation4 + "</tr></table>"; return smsMessage;
}
function getUserMessage16(input, truelength) {
var smsMessage = ""; calculation = "Not implemented"; // Cut the input string into pieces of 4 for (var i = 0; i < input.length; i = i + 4) { var hex1 = input.substring(i, i + 2); var hex2 = input.substring(i + 2, i + 4); smsMessage += "" + String.fromCharCode(HexToNum(hex1) * 256 + HexToNum(hex2)); } return smsMessage;
}
function getUserMessage8(input, truelength) {
var smsMessage = ""; calculation = "Not implemented"; // Cut the input string into pieces of 2 (just get the hex octets) for (var i = 0; i < input.length; i = i + 2) { var hex = input.substring(i, i + 2); smsMessage += "" + String.fromCharCode(HexToNum(hex)); } return smsMessage;
}
// Function to get SMSmeta info information from PDU String function getPDUMetaInfo(inp) {
var PDUString = inp; var start = 0; var out = ""; // Silently Strip leading AT command if (PDUString.substr(0, 2) == "AT") { for (var i = 0; i < PDUString.length; i++) { if (PDUString.charCodeAt(i) == 10) { PDUString = PDUString.substr(i + 1); break; } } } // Silently strip whitespace var NewPDU = ""; for (var i = 0; i < PDUString.length; i++) { if (MakeNum(PDUString.substr(i, 1)) != 16) { NewPDU = NewPDU + PDUString.substr(i, 1); } } PDUString = NewPDU; var SMSC_lengthInfo = HexToNum(PDUString.substring(0, 2)); var SMSC_info = PDUString.substring(2, 2 + (SMSC_lengthInfo * 2)); var SMSC_TypeOfAddress = SMSC_info.substring(0, 2); var SMSC_Number = SMSC_info.substring(2, 2 + (SMSC_lengthInfo * 2)); if (SMSC_lengthInfo != 0) { SMSC_Number = semiOctetToString(SMSC_Number); // if the length is odd remove the trailing F if ((SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'F') || (SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'f')) { SMSC_Number = SMSC_Number.substring(0, SMSC_Number.length - 1); } if (SMSC_TypeOfAddress == 91) { SMSC_Number = "+" + SMSC_Number; } } var start_SMSDeleivery = (SMSC_lengthInfo * 2) + 2; start = start_SMSDeleivery; var firstOctet_SMSDeliver = PDUString.substr(start, 2); start = start + 2; if ((HexToNum(firstOctet_SMSDeliver) & 0x20) == 0x20) { out += "Type::::Receipt requested\n"; } var DataHeader = 0; if ((HexToNum(firstOctet_SMSDeliver) & 0x40) == 0x40) { DataHeader = 1; out += "Type::::Data Header\n"; } // bit1 bit0 Message type // 0 0 SMS DELIVER (in the direction SC to MS) // 0 0 SMS DELIVER REPORT (in the direction MS to SC) // 1 0 SMS STATUS REPORT (in the direction SC to MS) // 1 0 SMS COMMAND (in the direction MS to SC) // 0 1 SMS SUBMIT (in the direction MS to SC) // 0 1 SMS SUBMIT REPORT (in the direction SC to MS) // 1 1 Reserved // This needs tidying up!! AJA if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 1 || (HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) // Transmit Message { if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) { out = "Type::::Unknown Message\nTreat as Deliver\n"; } var MessageReference = HexToNum(PDUString.substr(start, 2)); start = start + 2; // length in decimals var sender_addressLength = HexToNum(PDUString.substr(start, 2)); if (sender_addressLength % 2 != 0) { sender_addressLength += 1; } start = start + 2; var sender_typeOfAddress = PDUString.substr(start, 2); start = start + 2 var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength)); if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) { sender_number = sender_number.substring(0, sender_number.length - 1); } if (sender_typeOfAddress == 91) { sender_number = "+" + sender_number; } start += sender_addressLength; var tp_PID = PDUString.substr(start, 2); start += 2; var tp_DCS = PDUString.substr(start, 2); var tp_DCS_desc = tpDCSMeaning(tp_DCS); start += 2; var ValidityPeriod; switch ((HexToNum(firstOctet_SMSDeliver) & 0x18)) { case 0: // Not Present ValidityPeriod = "Not Present"; break; case 0x10: // Relative ValidityPeriod = "Rel " + cValid(HexToNum(PDUString.substr(start, 2))); start += 2; break; case 0x08: // Enhanced ValidityPeriod = "Enhanced - Not Decoded"; start += 14; break; case 0x18: // Absolute ValidityPeriod = "Absolute - Not Decoded"; start += 14; break; } // Commonish... var messageLength = HexToNum(PDUString.substr(start, 2)); start += 2; var bitSize = DCS_Bits(tp_DCS); var userData = "Undefined format"; if (bitSize == 7) { userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength); } else if (bitSize == 8) { userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength); } else if (bitSize == 16) { userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength); } userData = userData.substr(0, messageLength); if (bitSize == 16) { messageLength /= 2; } if (out.length == 0) { out = "Type::::Message:\n"; } out += "SMSC::::" + SMSC_Number + "\nReceipient::::" + sender_number + "\nValidity::::" + ValidityPeriod + "\nTP_PID::::" + tp_PID + "\nTP_DCS::::" + tp_DCS + "\nTP_DCS-popis::::" + tp_DCS_desc + "Message::::" + userData + "\nLength::::" + messageLength; } else // Receive Message if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 0) // Receive Message { // length in decimals out = "Type: Receive Message::::"; var sender_addressLength = HexToNum(PDUString.substr(start, 2)); start = start + 2; var sender_typeOfAddress = PDUString.substr(start, 2); start = start + 2 var sender_number; if (sender_typeOfAddress == "D0") { _sl = sender_addressLength; if (sender_addressLength % 2 != 0) { sender_addressLength += 1; } //alert(sender_addressLength); //alert(_sl); //alert(parseInt(sender_addressLength/2*8/7)); //alert(parseInt(_sl/2*8/7)); //alert(PDUString.substring(start,start+sender_addressLength)); //alert(PDUString.substring(start,start+_sl)); // sender_number = getUserMessage(PDUString.substring(start,start+sender_addressLength),parseInt(sender_addressLength/2*8/7)); sender_number = getUserMessage(PDUString.substring(start, start + sender_addressLength), parseInt(_sl / 2 * 8 / 7)); //alert(sender_number); } else { if (sender_addressLength % 2 != 0) { sender_addressLength += 1; } sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength)); if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) { sender_number = sender_number.substring(0, sender_number.length - 1); } if (sender_typeOfAddress == 91) { sender_number = "+" + sender_number; } } start += sender_addressLength; var tp_PID = PDUString.substr(start, 2); start += 2; var tp_DCS = PDUString.substr(start, 2); var tp_DCS_desc = tpDCSMeaning(tp_DCS); start += 2; var timeStamp = semiOctetToString(PDUString.substr(start, 14)); // get date var year = timeStamp.substring(0, 2); var month = timeStamp.substring(2, 4); var day = timeStamp.substring(4, 6); var hours = timeStamp.substring(6, 8); var minutes = timeStamp.substring(8, 10); var seconds = timeStamp.substring(10, 12); timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT ?"; //+" + timezone/4; /* var timezone = MakeNum(timeStamp.substring(12,13)); // timeStamp.substring(12,14); if (timezone >= 8) { timezone -= 8; timezone = timezone + timeStamp.substring(13,14); // Concats :: yeuck timezone = -timezone; timeStamp += "-"; } else { timezone = timezone + timeStamp.substring(13,14); // Concats :: yeuck timeStamp += "+"; } timeStamp += timezone/4; */ start += 14; // Commonish... var messageLength = HexToNum(PDUString.substr(start, 2)); start += 2; var bitSize = DCS_Bits(tp_DCS); var userData = "Undefined format"; if (bitSize == 7) { userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength); } else if (bitSize == 8) { userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength); } else if (bitSize == 16) { userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength); } userData = userData.substr(0, messageLength); userData = userData.replace(/\n/g, "") userData = userData.replace("::::", "") if (bitSize == 16) { messageLength /= 2; } out += "SMSC::::" + SMSC_Number + "\nSender::::" + sender_number + "\nTimeStamp::::" + timeStamp + "\nTP_PID::::" + tp_PID + "\nTP_DCS::::" + tp_DCS + "\nTP_DCS-popis::::" + tp_DCS_desc + "Message::::" + userData + "\nLength::::" + messageLength; } else { out = "Type::::Status Report\n"; var MessageReference = HexToNum(PDUString.substr(start, 2)); // ??? Correct this name start = start + 2; // length in decimals var sender_addressLength = HexToNum(PDUString.substr(start, 2)); if (sender_addressLength % 2 != 0) { sender_addressLength += 1; } start = start + 2; var sender_typeOfAddress = PDUString.substr(start, 2); start = start + 2 var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength)); if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) { sender_number = sender_number.substring(0, sender_number.length - 1); } if (sender_typeOfAddress == 91) { sender_number = "+" + sender_number; } start += sender_addressLength; var timeStamp = semiOctetToString(PDUString.substr(start, 14)); // get date var year = timeStamp.substring(0, 2); var month = timeStamp.substring(2, 4); var day = timeStamp.substring(4, 6); var hours = timeStamp.substring(6, 8); var minutes = timeStamp.substring(8, 10); var seconds = timeStamp.substring(10, 12); var timezone = timeStamp.substring(12, 14); timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT +" + timezone / 4; start += 14; var timeStamp2 = semiOctetToString(PDUString.substr(start, 14)); // get date var year2 = timeStamp2.substring(0, 2); var month2 = timeStamp2.substring(2, 4); var day2 = timeStamp2.substring(4, 6); var hours2 = timeStamp2.substring(6, 8); var minutes2 = timeStamp2.substring(8, 10); var seconds2 = timeStamp2.substring(10, 12); var timezone2 = timeStamp.substring(12, 14); timeStamp2 = day2 + "/" + month2 + "/" + year2 + " " + hours2 + ":" + minutes2 + ":" + seconds2 + " GMT +" + timezone2 / 4; start += 14; var mStatus = PDUString.substr(start, 2); out += "SMSC::::" + SMSC_Number + "\nSender::::" + sender_number + "\nMessageRef::::" + MessageReference + "\nTimeStamp::::" + timeStamp + "\nTimeStamp2::::" + timeStamp2 + "\nStatus Byte::::" + mStatus; } return out;
}
function change(what) {
var keysSoFar = what.value.length; if (keysSoFar > maxkeys) { if (!alerted) { //alert ('Max length '+ maxkeys + '!'); } what.value = what.value.substring(0, maxkeys); //chop alerted = true; keysSoFar = maxkeys; } window.status = "Characters left : " + (maxkeys - keysSoFar);
}
function DCS_Bits(tp_DCS) {
var AlphabetSize = 7; // Set Default //alert(tp_DCS); var pomDCS = HexToNum(tp_DCS); //alert(pomDCS); switch (pomDCS & 192) { case 0: if (pomDCS & 32) { // tp_DCS_desc="Compressed Text\n"; } else { // tp_DCS_desc="Uncompressed Text\n"; } switch (pomDCS & 12) { case 4: AlphabetSize = 8; break; case 8: AlphabetSize = 16; break; } break; case 192: switch (pomDCS & 0x30) { case 0x20: AlphabetSize = 16; break; case 0x30: if (pomDCS & 0x4) {; } else { AlphabetSize = 8; } break; } break; } return (AlphabetSize);
}
function tpDCSMeaning(tp_DCS) {
var tp_DCS_desc = tp_DCS; var pomDCS = HexToNum(tp_DCS); switch (pomDCS & 192) { case 0: if (pomDCS & 32) { tp_DCS_desc = "Compressed Text\n"; } else { tp_DCS_desc = "Uncompressed Text\n"; } if (!(pomDCS & 16)) // AJA { tp_DCS_desc += "MClass::No class\n"; } else { tp_DCS_desc += "MClass::"; switch (pomDCS & 3) { case 0: tp_DCS_desc += "0\n"; break; case 1: tp_DCS_desc += "1\n"; break; case 2: tp_DCS_desc += "2\n"; break; case 3: tp_DCS_desc += "3\n"; break; } } tp_DCS_desc += "Alphabet::::"; switch (pomDCS & 12) { case 0: tp_DCS_desc += "Default\n"; break; case 4: tp_DCS_desc += "8bit\n"; break; case 8: tp_DCS_desc += "UCS2(16)bit\n"; break; case 12: tp_DCS_desc += "Reserved\n"; break; } break; case 64: case 128: tp_DCS_desc = "Reserved coding group\n"; break; case 192: switch (pomDCS & 0x30) { case 0: tp_DCS_desc = "Message waiting group\n"; tp_DCS_desc += "Discard\n"; break; case 0x10: tp_DCS_desc = "Message waiting group\n"; tp_DCS_desc += "Store Message. Default Alphabet\n"; break; case 0x20: tp_DCS_desc = "Message waiting group\n"; tp_DCS_desc += "Store Message. UCS2 Alphabet\n"; break; case 0x30: tp_DCS_desc = "Data coding message class\n"; if (pomDCS & 0x4) { tp_DCS_desc += "Default Alphabet\n"; } else { tp_DCS_desc += "8 bit Alphabet\n"; } break; } break; } //alert(tp_DCS.valueOf()); return (tp_DCS_desc);
}
function checkFlag(valid) {
if (valid.checked) { document.pduToStringForm.valid.disabled = false; document.pduToStringForm.valid.value = "170"; document.getElementById('validy').innerHTML = cValid("170"); } else { document.pduToStringForm.valid.disabled = true; document.pduToStringForm.valid.value = ""; document.getElementById('validy').innerHTML = ""; }
}
function Validity(valid) {
var byValidityPeriod = 0; if (isNaN(parseInt(valid))) { valid = 0; document.pduToStringForm.valid.value = valid; } else { valid = parseInt(valid); if (valid < 0) { valid = 0; document.pduToStringForm.valid.value = valid; } if (valid > 255) { valid = 255; document.pduToStringForm.valid.value = valid; } } return cValid(valid);
}
function cValid(valid) {
var value, out = ""; // if (isNaN(parseInt(valid))) // { // alert("No text please we're British!"); // } valid = parseInt(valid); if (valid <= 143) { value = (valid + 1) * 5; // Minutes } else if (valid <= 167) { value = ((valid - 143) / 2 + 12); // Hours value *= 60; // Convert to Minutes } else if (valid <= 196) { value = valid - 166; // days value *= 60 * 24; // Convert to Minutes } else { value = valid - 192; // Weeks value *= 7 * 60 * 24; // Convert to Minutes } var mins, hours, days, weeks; mins = value % 60; hours = value / 60; days = hours / 24; weeks = days / 7; hours %= 24; days %= 7; if (parseInt(weeks) != 0) { out += parseInt(weeks) + "w "; } if (parseInt(days) != 0) { out += parseInt(days) + "d "; } if (parseInt(hours) != 0) { out += parseInt(hours) + "h "; } if (mins != 0) { out += mins + "m "; } return out;
}