//
// NSAddons.m
// VoiceBase
//
// Created by Mr. Gecko on 3/4/09.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
#import "MGMAddons.h"
#import "MGMInbox.h"
#import "MGMXML.h"
@implementation NSString (MGMAddons)
+ (NSString *)stringWithSeconds:(int)theSeconds {
int time = theSeconds;
int seconds = time%60;
time = time/60;
int minutes = time%60;
time = time/60;
int hours = time%24;
int days = time/24;
NSString *string;
if (days!=0) {
string = [NSString stringWithFormat:@"%d:%02d:%02d:%02d", days, hours, minutes, seconds];
} else if (hours!=0) {
string = [NSString stringWithFormat:@"%d:%02d:%02d", hours, minutes, seconds];
} else {
string = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
}
return string;
}
- (NSString *)flattenHTML {
NSString *xml = [NSString stringWithFormat:@"%@", self];
MGMXMLElement *xmlElement = [[[MGMXMLElement alloc] initWithXMLString:xml error:nil] autorelease];
return [xmlElement stringValue];
}
- (NSString *)replace:(NSString *)targetString with:(NSString *)replaceString {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSMutableString *temp = [NSMutableString new];
NSRange replaceRange = NSMakeRange(0, [self length]);
NSRange rangeInOriginalString = replaceRange;
int replaced = 0;
while (1) {
NSRange rangeToCopy;
NSRange foundRange = [self rangeOfString:targetString options:0 range:rangeInOriginalString];
if (foundRange.length==0) break;
rangeToCopy = NSMakeRange(rangeInOriginalString.location, foundRange.location - rangeInOriginalString.location);
[temp appendString:[self substringWithRange:rangeToCopy]];
[temp appendString:replaceString];
rangeInOriginalString.length -= (NSMaxRange(foundRange)-rangeInOriginalString.location);
rangeInOriginalString.location = NSMaxRange(foundRange);
replaced++;
if ((replaced%100)==0) {
[pool drain];
pool = [NSAutoreleasePool new];
}
}
if (rangeInOriginalString.length>0) [temp appendString:[self substringWithRange:rangeInOriginalString]];
[pool drain];
return [temp autorelease];
}
- (BOOL)containsString:(NSString *)string {
return ([[self lowercaseString] rangeOfString:[string lowercaseString]].location!=NSNotFound);
}
- (NSString *)javascriptEscape {
NSString *escaped = [self replace:@"\\" with:@"\\\\"];
escaped = [escaped replace:@"'" with:@"\\'"];
escaped = [escaped replace:@"\n" with:@"
"];
escaped = [escaped replace:@"\r" with:@""];
return escaped;
}
- (NSString *)filePath {
/*NSString *path = [self stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (![path hasPrefix:@"file:///"]) {
path = [NSString stringWithFormat:@"file://%@", path];
}
return [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];*/
return [[NSURL fileURLWithPath:self] absoluteString];
}
- (NSString *)littersToNumbers {
NSMutableString *outString = [NSMutableString string];
for (int i=0; i<[self length]; i++) {
unichar character = [self characterAtIndex:i];
switch (character) {
case 'a'...'c':
case 'A'...'C':
character = '2';
break;
case 'd'...'f':
case 'D'...'F':
character = '3';
break;
case 'g'...'i':
case 'G'...'I':
character = '4';
break;
case 'j'...'l':
case 'J'...'L':
character = '5';
break;
case 'm'...'o':
case 'M'...'O':
character = '6';
break;
case 'p'...'s':
case 'P'...'S':
character = '7';
break;
case 't'...'v':
case 'T'...'V':
character = '8';
break;
case 'w'...'z':
case 'W'...'Z':
character = '9';
break;
case '0'...'9':
break;
default:
character = '\0';
break;
}
if (character!='\0')
CFStringAppendCharacters((CFMutableStringRef)outString, &character, 1);
}
return outString;
}
- (NSString *)removePhoneWhiteSpace {
NSString *number = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
number = [number replace:@" " with:@""];
number = [number replace:@"-" with:@""];
number = [number replace:@")" with:@""];
number = [number replace:@"(" with:@""];
number = [number replace:@"+1" with:@"1"];
number = [number replace:@"+" with:@"011"];
number = [number replace:@"." with:@""];
return number;
}
- (BOOL)isPhone {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return YES;
NSString *number = [self removePhoneWhiteSpace];
if ([number length]<1)
return NO;
return [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[number characterAtIndex:0]];
}
- (BOOL)isPhoneComplete {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return YES;
NSString *number = [self removePhoneWhiteSpace];
if ([number length]<1 || ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[number characterAtIndex:0]])
return NO;
if ([number hasPrefix:@"011"])
return YES;
if ([number length]==11 && [number hasPrefix:@"1"])
return YES;
else if ([number length]==10 || [number length]==7)
return YES;
return NO;
}
- (NSString *)phoneFormatWithAreaCode:(NSString *)theAreaCode {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
int length = [number length];
if (length==11 && [number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else if (length<=7)
number = [NSString stringWithFormat:@"+1%@%@", theAreaCode, number];
else if (length<=10)
number = [NSString stringWithFormat:@"+1%@", number];
}
return number;
}
- (NSString *)phoneFormatAreaCode:(NSString *)theAreaCode {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
int length = [number length];
if (length==11 && [number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else
number = [NSString stringWithFormat:@"+1%@%@", theAreaCode, number];
}
return number;
}
- (NSString *)phoneFormat {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
if ([number hasPrefix:@"1"])
number = [NSString stringWithFormat:@"+%@", number];
else
number = [NSString stringWithFormat:@"+1%@", number];
}
return number;
}
- (NSString *)readableNumber {
if ([self rangeOfString:@"@"].location!=NSNotFound)
return self;
NSString *number = [[self removePhoneWhiteSpace] littersToNumbers];
if (![number hasPrefix:@"011"]) {
if ([number length]==10) {
NSString *areaCode = [number substringToIndex:3];
number = [number substringFromIndex:3];
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
number = [NSString stringWithFormat:@"(%@) %@-%@", areaCode, firstNumbers, number];
} else if ([number length]==11 && [number hasPrefix:@"1"]) {
number = [number substringFromIndex:1];
NSString *areaCode = [number substringToIndex:3];
number = [number substringFromIndex:3];
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
if ([areaCode isEqual:@"800"])
number = [NSString stringWithFormat:@"1 (%@) %@-%@", areaCode, firstNumbers, number];
else
number = [NSString stringWithFormat:@"(%@) %@-%@", areaCode, firstNumbers, number];
} else if ([number length]>=7 && [number length]<=10) {
NSString *firstNumbers = [number substringToIndex:3];
number = [number substringFromIndex:3];
number = [NSString stringWithFormat:@"%@-%@", firstNumbers, number];
}
} else {
number = [number substringFromIndex:3];
number = [@"+" stringByAppendingString:number];
}
return number;
}
- (NSString *)areaCode {
NSString *areaCode = [[self removePhoneWhiteSpace] littersToNumbers];
if (![areaCode hasPrefix:@"011"]) {
if ([areaCode length]>7) {
if ([areaCode hasPrefix:@"1"])
areaCode = [areaCode substringFromIndex:1];
areaCode = [areaCode substringToIndex:3];
}
return areaCode;
}
return @"";
}
- (NSString *)areaCodeLocation {
switch ([self intValue]) {
case 200:
return @"Service access code";
break;
case 201:
return @"New Jersey - NorthEast";
break;
case 202:
return @"District Of Columbia";
break;
case 203:
return @"Connecticut";
break;
case 204:
return @"Manitoba";
break;
case 205:
return @"Alabama - Birmingham/Central Alabama";
break;
case 206:
return @"Washington - Seattle";
break;
case 207:
return @"Maine";
break;
case 208:
return @"Idaho";
break;
case 209:
return @"California - Central";
break;
case 210:
return @"Texas - San Antonio";
break;
case 211:
return @"Coin Phone Refunds";
break;
case 212:
return @"New York - Manhattan";
break;
case 213:
return @"California - Los Angeles";
break;
case 214:
return @"Texas - Dallas";
break;
case 215:
return @"Pennsylvania - SouthEast";
break;
case 216:
return @"Ohio - Cleveland";
break;
case 217:
return @"Illinois - South Central";
break;
case 218:
return @"Minnesota - Northern";
break;
case 219:
return @"Indiana - Northern";
break;
case 224:
return @"Illinois overlay deferred";
break;
case 225:
return @"Louisiana";
break;
case 228:
return @"Mississippi";
break;
case 229:
return @"Georgia - (split from 912)";
break;
case 231:
return @"Michigan";
break;
case 234:
return @"Ohio (overlay 330)";
break;
case 240:
return @"Maryland";
break;
case 242:
return @"Bahamas-Carib";
break;
case 246:
return @"Barbados-Carib";
break;
case 248:
return @"Michigan - Oakland Cty";
break;
case 250:
return @"British Columbia";
break;
case 252:
return @"North Carolina";
break;
case 253:
return @"Washington - Tacoma";
break;
case 254:
return @"Texas - Ft. Worth";
break;
case 256:
return @"Alabama - Huntsville/North Alabama";
break;
case 262:
return @"Wisconsin";
break;
case 264:
return @"Anguilla";
break;
case 267:
return @"Pennsylvania (overlay 215)";
break;
case 268:
return @"Antigua/Barbuda-Carib";
break;
case 270:
return @"Kentucky";
break;
case 278:
return @"Michigan overlay suspended";
break;
case 281:
return @"Texas - Houston";
break;
case 284:
return @"British V.I.-Carib";
break;
case 300:
return @"Service Access Code";
break;
case 301:
return @"Maryland - Southern&Western";
break;
case 302:
return @"Delaware";
break;
case 303:
return @"Colorado - Northern&Western";
break;
case 304:
return @"West Virginia";
break;
case 305:
return @"Florida - SouthEast";
break;
case 306:
return @"Saskatchewan";
break;
case 307:
return @"Wyoming";
break;
case 308:
return @"Nebraska - Western";
break;
case 309:
return @"Illinois - West Central";
break;
case 310:
return @"California - Los Angeles";
break;
case 311:
return @"Reserved Special Function";
break;
case 312:
return @"Illinois - Chicago";
break;
case 313:
return @"Michigan - Eastern";
break;
case 314:
return @"Missouri - Eastern";
break;
case 315:
return @"New York - North Central";
break;
case 316:
return @"Kansas - Southern";
break;
case 317:
return @"Indiana - Central";
break;
case 318:
return @"Louisiana - Western";
break;
case 319:
return @"Iowa - Eastern";
break;
case 320:
return @"Minnesota";
break;
case 321:
return @"Florida Space Coast (Melbourne)";
break;
case 323:
return @"California - Los Angeles";
break;
case 325:
return @"Texas - San Angelo";
break;
case 330:
return @"Ohio - Eastern";
break;
case 331:
return @"Illinois overlay deferred";
break;
case 334:
return @"Alabama - Montgomery/Mobile/Lower Alabama";
break;
case 336:
return @"North Carolina";
break;
case 337:
return @"Louisiana";
break;
case 339:
return @"Massachusetts";
break;
case 340:
return @"US Virgin Islands";
break;
case 341:
return @"California";
break;
case 345:
return @"Cayman Islands";
break;
case 347:
return @"New York - NYC-not Mnhtn (split from 718)";
break;
case 351:
return @"Massachusetts";
break;
case 352:
return @"Florida - North";
break;
case 360:
return @"Washington - Western";
break;
case 361:
return @"Texas - (split from 512)";
break;
case 369:
return @"California - (split from 707)";
break;
case 385:
return @"Utah";
break;
case 400:
return @"Service Access Code";
break;
case 401:
return @"Rhode Island";
break;
case 402:
return @"Nebraska - Eastern";
break;
case 403:
return @"Alberta , Southern";
break;
case 404:
return @"Georgia - Metro Atlanta";
break;
case 405:
return @"Oklahoma- Southern&Western";
break;
case 406:
return @"Montana";
break;
case 407:
return @"Florida - Greater Orlando";
break;
case 408:
return @"California - Central Coastal";
break;
case 409:
return @"Texas - SouthEast";
break;
case 410:
return @"Maryland - Eastern";
break;
case 411:
return @"Directory Services";
break;
case 412:
return @"Pennsylvania - Pittsburgh";
break;
case 413:
return @"Massachusetts - Western";
break;
case 414:
return @"Wisconsin - Eastern";
break;
case 415:
return @"California - San Francisco";
break;
case 416:
return @"Ontario - City of Toronto";
break;
case 417:
return @"Missouri - SouthWest";
break;
case 418:
return @"Quebec - NorthEast";
break;
case 419:
return @"Ohio - NorthWest";
break;
case 423:
return @"Tennessee - Eastern";
break;
case 424:
return @"California (overlay 310)";
break;
case 425:
return @"Washington - Seattle east suburbs";
break;
case 435:
return @"Utah";
break;
case 440:
return @"Ohio - Northeast";
break;
case 441:
return @"Bermuda-Carib";
break;
case 442:
return @"California";
break;
case 443:
return @"Maryland";
break;
case 445:
return @"Pennsylvania";
break;
case 450:
return @"Quebec";
break;
case 456:
return @"Inbound International";
break;
case 464:
return @"Illinois overlay deferred";
break;
case 469:
return @"Texas";
break;
case 473:
return @"Grenada-Carib";
break;
case 475:
return @"Connecticut - (overlay 203)";
break;
case 478:
return @"Georgia";
break;
case 480:
return @"Arizona - Phoenix. East Valley";
break;
case 484:
return @"Pennsylvania (overlay 610)";
break;
case 500:
return @"Personal Communication Svcs";
break;
case 501:
return @"Arkansas";
break;
case 502:
return @"Kentucky - Western";
break;
case 503:
return @"Oregon - Portland tri-metro";
break;
case 504:
return @"Louisiana - Eastern";
break;
case 505:
return @"New Mexico";
break;
case 506:
return @"New Brunswick";
break;
case 507:
return @"Minnesota - Southern";
break;
case 508:
return @"Massachusetts - Eastern";
break;
case 509:
return @"Washington - Eastern";
break;
case 510:
return @"California - East Bay Area";
break;
case 512:
return @"Texas - Southern";
break;
case 513:
return @"Ohio - SouthWest";
break;
case 514:
return @"Quebec - Southern";
break;
case 515:
return @"Iowa - Central";
break;
case 516:
return @"New York - Nassau County LI";
break;
case 517:
return @"Michigan - Central";
break;
case 518:
return @"New York - NorthEast";
break;
case 519:
return @"Ontario - SouthWest";
break;
case 520:
return @"Arizona";
break;
case 530:
return @"California - Northern";
break;
case 540:
return @"Virginia";
break;
case 541:
return @"Oregon";
break;
case 555:
return @"Not Available";
break;
case 559:
return @"California - Central";
break;
case 561:
return @"Florida - Greater Palm Beach";
break;
case 562:
return @"California - Los Angeles";
break;
case 564:
return @"Washington - (overlay 360)";
break;
case 567:
return @"Ohio";
break;
case 570:
return @"Pennsylvania - (split 717)";
break;
case 571:
return @"Virginia";
break;
case 573:
return @"Missouri";
break;
case 580:
return @"Oklahoma";
break;
case 586:
return @"Michigan overlay suspended";
break;
case 600:
return @"Canada/Services";
break;
case 601:
return @"Mississippi";
break;
case 602:
return @"Arizona";
break;
case 603:
return @"New Hampshire";
break;
case 604:
return @"British Columbia";
break;
case 605:
return @"South Dakota";
break;
case 606:
return @"Kentucky - Eastern";
break;
case 607:
return @"New York - South Central";
break;
case 608:
return @"Wisconsin - SouthWest";
break;
case 609:
return @"New Jersey - Southern";
break;
case 610:
return @"Pennsylvania";
break;
case 611:
return @"Repair Service";
break;
case 612:
return @"Minnesota - Minneapolis";
break;
case 613:
return @"Ontario - SouthEast";
break;
case 614:
return @"Ohio - Columbus Area";
break;
case 615:
return @"Tennessee - Middle/Western";
break;
case 616:
return @"Michigan - Western";
break;
case 617:
return @"Massachusetts - Eastern";
break;
case 618:
return @"Illinois - Southern";
break;
case 619:
return @"California - San Diego, S.Cal";
break;
case 620:
return @"Kansas";
break;
case 623:
return @"Arizona - Phoenix. West Valley";
break;
case 626:
return @"California - Pas./San Gabr.Vly";
break;
case 627:
return @"California - (split from 707)";
break;
case 628:
return @"California";
break;
case 630:
return @"Illinois - Chicago suburbs";
break;
case 631:
return @"New York - Suffolk County LI";
break;
case 636:
return @"Missouri";
break;
case 641:
return @"Iowa";
break;
case 646:
return @"New York - Manhattan (split from 212)";
break;
case 647:
return @"Ontario";
break;
case 649:
return @"Turks & Caicos";
break;
case 650:
return @"California - West Bay Area";
break;
case 651:
return @"Minnesota - St. Paul ";
break;
case 657:
return @"California";
break;
case 660:
return @"Missouri";
break;
case 661:
return @"California - (split from 805)";
break;
case 662:
return @"Mississippi";
break;
case 664:
return @"Montserrat-Carib";
break;
case 669:
return @"California";
break;
case 670:
return @"CNMI-Mariana Islands";
break;
case 671:
return @"Guam";
break;
case 678:
return @"Georgia";
break;
case 679:
return @"Michigan overlay suspended";
break;
case 682:
return @"Texas";
break;
case 700:
return @"Service Varies by LD Carrier";
break;
case 701:
return @"North Dakota";
break;
case 702:
return @"Nevada - Clark County";
break;
case 703:
return @"Virginia - Northern & Western";
break;
case 704:
return @"North Carolina - Western";
break;
case 705:
return @"Ontario - Northern";
break;
case 706:
return @"Georgia - Northern";
break;
case 707:
return @"California - North Coastal";
break;
case 708:
return @"Illinois - NorthEast";
break;
case 709:
return @"Newfndlnd, Labradr";
break;
case 710:
return @"Gov Emer Telecom Svc";
break;
case 711:
return @"Special Function";
break;
case 712:
return @"Iowa - Western";
break;
case 713:
return @"Texas - Houston Area";
break;
case 714:
return @"California - Orange County";
break;
case 715:
return @"Wisconsin - Northern";
break;
case 716:
return @"New York - Western";
break;
case 717:
return @"Pennsylvania - East Central";
break;
case 718:
return @"New York - NYC except Mnhtn";
break;
case 719:
return @"Colorado - SouthEast";
break;
case 720:
return @"Colorado";
break;
case 724:
return @"Pennsylvania - Western";
break;
case 727:
return @"Florida Greater St Petersburg";
break;
case 731:
return @"Tennessee";
break;
case 732:
return @"New Jersey - Central";
break;
case 734:
return @"Michigan - Ann Arbor/Ypsilanti";
break;
case 737:
return @"Texas";
break;
case 740:
return @"Ohio - SouthEast";
break;
case 747:
return @"California";
break;
case 752:
return @"California";
break;
case 757:
return @"Virginia";
break;
case 758:
return @"St. Lucia-Carib";
break;
case 760:
return @"California - San Diego";
break;
case 763:
return @"Minnesota - Minneapolis Suburbs";
break;
case 764:
return @"California";
break;
case 765:
return @"Indiana - Outside Indianapolis";
break;
case 767:
return @"Dominica";
break;
case 770:
return @"Georgia";
break;
case 773:
return @"Illinois - Chicago";
break;
case 774:
return @"Massachusetts";
break;
case 775:
return @"Nevada";
break;
case 778:
return @"British Columbia";
break;
case 780:
return @"Alberta, Edmonton & North";
break;
case 781:
return @"Massachusetts";
break;
case 784:
return @"St. Vincent/Grenadines";
break;
case 785:
return @"Kansas - Northern";
break;
case 786:
return @"Florida - Overlay the 305 area";
break;
case 787:
return @"Puerto Rico-Carib";
break;
case 800:
return @"Toll-Free Calling";
break;
case 801:
return @"Utah";
break;
case 802:
return @"Vermont";
break;
case 803:
return @"South Carolina";
break;
case 804:
return @"Virginia - SouthEast";
break;
case 805:
return @"California - SouthCentral";
break;
case 806:
return @"Texas - North Panhandle";
break;
case 807:
return @"Ontario - NorthWest";
break;
case 808:
return @"Hawaii";
break;
case 809:
return @"Caribbean Islands";
break;
case 810:
return @"Michigan - Northern";
break;
case 811:
return @"Special Function";
break;
case 812:
return @"Indiana - Southern";
break;
case 813:
return @"Florida - Tampa area";
break;
case 814:
return @"Pennsylvania - West Central";
break;
case 815:
return @"Illinois - Northern";
break;
case 816:
return @"Missouri - NorthWest";
break;
case 817:
return @"Texas - North Central";
break;
case 818:
return @"California - SF Valley, LA area";
break;
case 819:
return @"Quebec - Eastern";
break;
case 822:
return @"Future Toll-Free Svc.";
break;
case 828:
return @"North Carolina";
break;
case 830:
return @"Texas -South, near San Antonio";
break;
case 831:
return @"California, Central Coastal";
break;
case 832:
return @"Texas, Houston area";
break;
case 833:
return @"Future Toll-Free Svc.";
break;
case 835:
return @"Pennsylvania";
break;
case 843:
return @"South Carolina";
break;
case 844:
return @"Future Toll-Free Svc.";
break;
case 845:
return @"New York";
break;
case 847:
return @"Illinois - Chicago suburbs";
break;
case 850:
return @"Florida panhandle";
break;
case 855:
return @"Toll-Free Svc.";
break;
case 856:
return @"New Jersey - Southern";
break;
case 857:
return @"Massachusetts";
break;
case 858:
return @"California - (split from 619)";
break;
case 859:
return @"Kentucky";
break;
case 860:
return @"Connecticut";
break;
case 863:
return @"Florida - South Central";
break;
case 864:
return @"South Carolina";
break;
case 865:
return @"Tennessee";
break;
case 866:
return @"Toll-Free Svc.";
break;
case 867:
return @"Yukon/N.W.Territories";
break;
case 868:
return @"Trinidad and Tobago-Carib";
break;
case 869:
return @"St.Kitts and Nevis-Carib";
break;
case 870:
return @"Arkansas";
break;
case 872:
return @"Illinois overlay deferred";
break;
case 876:
return @"Jamaica";
break;
case 877:
return @"Toll-Free Calling";
break;
case 878:
return @"Pennsylvania";
break;
case 880:
return @"Paid 800 Service";
break;
case 881:
return @"Paid 888 Service";
break;
case 882:
return @"Paid 877 Service";
break;
case 888:
return @"Toll-Free Calling";
break;
case 900:
return @"Value Added Info Svc Code";
break;
case 901:
return @"Tennessee - Western";
break;
case 902:
return @"Prince Edward Island, Nova Scotia ";
break;
case 903:
return @"Texas - NorthEast";
break;
case 904:
return @"Florida - Northeast";
break;
case 905:
return @"Greater Toronto Area, except Toronto";
break;
case 906:
return @"Michigan - Upper North";
break;
case 907:
return @"Alaska";
break;
case 908:
return @"New Jersey - Central";
break;
case 909:
return @"California - Riverside&S.Bern";
break;
case 910:
return @"North Carolina";
break;
case 911:
return @"Emergency Services";
break;
case 912:
return @"Georgia - Southern";
break;
case 913:
return @"Kansas - Northern";
break;
case 914:
return @"New York - Southern";
break;
case 915:
return @"Texas - Western";
break;
case 916:
return @"California - Sacramento";
break;
case 917:
return @"New York City";
break;
case 918:
return @"Oklahoma - NorthEast";
break;
case 919:
return @"North Carolina - Eastern";
break;
case 920:
return @"Wisconsin";
break;
case 925:
return @"California - S.F.Bay area";
break;
case 931:
return @"Tennessee";
break;
case 935:
return @"California - (split from 619)";
break;
case 936:
return @"Texas - (split from 409)";
break;
case 937:
return @"Ohio - Dayton, SW Ohio";
break;
case 939:
return @"Puerto Rico";
break;
case 940:
return @"Texas - Ft. Worth";
break;
case 941:
return @"Florida - Cape Coral area";
break;
case 947:
return @"Michigan overlay suspended";
break;
case 949:
return @"California - Orange County";
break;
case 951:
return @"California";
break;
case 952:
return @"Minnesota - Minneapolis Suburbs";
break;
case 954:
return @"Florida - Greater Ft Lauderdale";
break;
case 956:
return @"Texas - Laredo/Brownsville";
break;
case 959:
return @"Connecticut - (overlay 860)";
break;
case 970:
return @"Colorado";
break;
case 971:
return @"Oregon";
break;
case 972:
return @"Texas - Dallas";
break;
case 973:
return @"New Jersey - Northern";
break;
case 978:
return @"Massachusetts";
break;
case 979:
return @"Texas";
break;
case 980:
return @"North Carolina";
break;
case 985:
return @"Louisiana";
break;
case 989:
return @"Michigan";
break;
}
return @"No Location Found";
}
- (NSString *)addPercentEscapes {
NSString *result = [self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
CFStringRef escapedString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:^@&=+$,/?%#[]|"), kCFStringEncodingUTF8);
if (escapedString!=NULL)
result = [(NSString *)escapedString autorelease];
return result;
}
#if !TARGET_OS_IPHONE
- (NSString *)truncateForWidth:(double)theWidth attributes:(NSDictionary *)theAttributes {
NSString *endString = @"…";
NSString *truncatedString = self;
int truncatedStringLength = [self length];
if (truncatedStringLength>2 && [truncatedString sizeWithAttributes:theAttributes].width>theWidth) {
double targetWidth = theWidth - [endString sizeWithAttributes:theAttributes].width;
NSCharacterSet *whiteSpaceCharacters = [NSCharacterSet whitespaceAndNewlineCharacterSet];
while ([truncatedString sizeWithAttributes:theAttributes].width > targetWidth && truncatedStringLength) {
truncatedStringLength--;
while ([whiteSpaceCharacters characterIsMember:[truncatedString characterAtIndex:truncatedStringLength-1]])
truncatedStringLength--;
truncatedString = [truncatedString substringToIndex:truncatedStringLength];
}
truncatedString = [truncatedString stringByAppendingString:endString];
}
return truncatedString;
}
#endif
NSComparisonResult dateSort(NSDictionary *info1, NSDictionary *info2, void *context) {
NSComparisonResult result = [[info1 objectForKey:MGMITime] compare:[info2 objectForKey:MGMITime]];
if (result==NSOrderedAscending) {
result = NSOrderedDescending;
} else if (result==NSOrderedDescending) {
result = NSOrderedAscending;
}
return result;
}
- (BOOL)isIPAddress {
NSArray *components = [self componentsSeparatedByString:@"."];
if ([components count]!=4)
return NO;
NSCharacterSet *characterSet = [NSCharacterSet decimalDigitCharacterSet];
for (int i=0; i<[components count]; i++) {
NSString *component = [components objectAtIndex:i];
if ([component length]>3)
return NO;
for (int c=0; c<[component length]; c++) {
if (![characterSet characterIsMember:[component characterAtIndex:c]])
return NO;
}
if ([component intValue]>255)
return NO;
}
return YES;
}
#if MGMSIPENABLED
+ (NSString *)stringWithPJString:(pj_str_t)pjString {
return [[[NSString alloc] initWithBytes:pjString.ptr length:pjString.slen encoding:NSUTF8StringEncoding] autorelease];
}
- (pj_str_t)PJString {
return pj_str((char *)[self UTF8String]);
}
#endif
@end
@implementation NSData (MGMAddons)
- (NSData *)resizeTo:(
#if TARGET_OS_IPHONE
CGSize
#else
NSSize
#endif
)theSize {
#if TARGET_OS_IPHONE
UIImage *image = [[UIImage alloc] initWithData:self];
#else
NSImage *image = [[NSImage alloc] initWithData:self];
#endif
if (image==nil)
return self;
if (image!=nil) {
#if TARGET_OS_IPHONE
CGSize size = [image size];
#else
NSSize size = [image size];
#endif
float scaleFactor = 0.0;
float scaledWidth = theSize.width;
float scaledHeight = theSize.height;
if (
#if TARGET_OS_IPHONE
!CGSizeEqualToSize(size, theSize)
#else
!NSEqualSizes(size, theSize)
#endif
) {
float widthFactor = theSize.width / size.width;
float heightFactor = theSize.height / size.height;
if (widthFactor < heightFactor)
scaleFactor = widthFactor;
else
scaleFactor = heightFactor;
scaledWidth = size.width * scaleFactor;
scaledHeight = size.height * scaleFactor;
}
NSData *scaledData = self;
#if TARGET_OS_IPHONE
CGSize newSize = CGSizeMake(scaledWidth, scaledHeight);
if (!CGSizeEqualToSize(newSize, CGSizeZero)) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, scaledWidth, scaledHeight)];
UIImage *newImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
[pool drain];
scaledData = UIImagePNGRepresentation(newImage);
[newImage release];
}
#else
NSSize newSize = NSMakeSize(scaledWidth, scaledHeight);
if (!NSEqualSizes(newSize, NSZeroSize)) {
NSImage *newImage = [[NSImage alloc] initWithSize:newSize];
if (newImage==nil || NSEqualSizes([newImage size], NSZeroSize))
return self;
[newImage lockFocus];
NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
[graphicsContext setImageInterpolation:NSImageInterpolationHigh];
[graphicsContext setShouldAntialias:YES];
[image drawInRect:NSMakeRect(0, 0, scaledWidth, scaledHeight) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[newImage unlockFocus];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:[newImage TIFFRepresentation]];
scaledData = [imageRep representationUsingType:NSPNGFileType properties:nil];
[newImage release];
}
#endif
[image release];
return scaledData;
}
return nil;
}
@end