diff --git a/Classes/Misc/ListeningDataSource.m b/Classes/Misc/ListeningDataSource.m index dd2ad5f..768690c 100644 --- a/Classes/Misc/ListeningDataSource.m +++ b/Classes/Misc/ListeningDataSource.m @@ -107,7 +107,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N if (shoutIndex == 0) { return [controller refreshButtonCell]; } - + ShoutListCell *cell = (ShoutListCell *)[tableView dequeueReusableCellWithIdentifier: CELL_REUSE_ID]; if (cell == nil) { cell = [[[ShoutListCell alloc] initWithFrame: CGRectZero reuseIdentifier: CELL_REUSE_ID] autorelease]; @@ -184,7 +184,7 @@ - (void) updateIcons { NSLog(@" - thread: %@", thread); for (Shout *shout in shouts) { //CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); - //UIImage *icon = + //UIImage *icon = [shout icon]; //CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent(); //NSLog(@" - user: %@; place:%@; icon load time: %f", [shout username], [shout placeName], (endTime - startTime)); diff --git a/Classes/Misc/PlacesDataSource.m b/Classes/Misc/PlacesDataSource.m index 62715a5..31d3d03 100644 --- a/Classes/Misc/PlacesDataSource.m +++ b/Classes/Misc/PlacesDataSource.m @@ -120,7 +120,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_REUSE_ID]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CELL_REUSE_ID] autorelease]; - + CGFloat nameX = NAME_MARGIN_HORIZONTAL; CGFloat nameY = NAME_MARGIN_VERTICAL; CGFloat nameWidth = (cell.contentView.frame.size.width * 0.8) - (NAME_MARGIN_HORIZONTAL * 1.5); @@ -169,13 +169,13 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N [nameLabel setTextColor:[UIColor blackColor]]; } [nameLabel setText:nameValue]; - + UILabel *distLabel = (UILabel *)[cell.contentView viewWithTag:TAG_DISTANCE]; //NSLog(@" - distLabel: %@", distLabel); NSString *distValue = [NSString stringWithFormat:@"%1.0fm", ([[place distance] doubleValue] * 1000)]; //NSLog(@" - distValue: %@", distValue); [distLabel setText:distValue]; - + return cell; } diff --git a/Classes/Misc/ShizzupAppDelegate.m b/Classes/Misc/ShizzupAppDelegate.m index 4b32f3f..73b15ff 100644 --- a/Classes/Misc/ShizzupAppDelegate.m +++ b/Classes/Misc/ShizzupAppDelegate.m @@ -57,7 +57,7 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application { // Attempt to load saved credentials [self retrieveCredentials]; - + // Crash reporting stuff PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; // Check if we previously crashed @@ -82,7 +82,7 @@ - (void) handleCrashReport { PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; NSData *crashData; NSError *error; - + // Try loading the crash report crashData = [crashReporter loadPendingCrashReportDataAndReturnError: &error]; if (crashData == nil) { @@ -111,7 +111,7 @@ - (void) handleCrashReport { //NSLog(@"JSON crash data: %@", [report JSONRepresentation]); } } - + // Purge the report //[crashReporter purgePendingCrashReport]; return; diff --git a/Classes/Model/PlaceListReceiver.m b/Classes/Model/PlaceListReceiver.m index d6bdc12..1244a2c 100644 --- a/Classes/Model/PlaceListReceiver.m +++ b/Classes/Model/PlaceListReceiver.m @@ -95,7 +95,7 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [converter release]; //NSLog(@" filteredResponseText: %@", filteredResponseText); NSDictionary *responseDictionary = [filteredResponseText JSONValue]; - + //NSLog(@" - responseDictionary: %@: %@", [responseDictionary class], responseDictionary); NSDictionary *results = [responseDictionary valueForKey:@"results"]; //NSLog(@" - results: %@: %@", [results class], results); diff --git a/Classes/Model/ShizzowApiConnection.m b/Classes/Model/ShizzowApiConnection.m index 5a17b7e..94acdba 100644 --- a/Classes/Model/ShizzowApiConnection.m +++ b/Classes/Model/ShizzowApiConnection.m @@ -22,20 +22,20 @@ - (NSURLConnection *) callUri:(NSString *)apiUriStub delegate:(id)delegate { - (NSURLConnection *) callUri:(NSString *)apiUriStub usingMethod:(NSString *)method withDelegate:(id)delegate withBody:(NSString *)body { //NSLog(@" - apiUriStub: %@", apiUriStub); - + NSString *apiUrlString = [NSString stringWithFormat:@"%@%@", SHIZZOW_API_URL_PREFIX, apiUriStub]; //NSLog(@" - apiUrlString: %@", apiUrlString); - + NSURL *apiUrl = [NSURL URLWithString:apiUrlString]; NSLog(@" - apiUrl: %@", apiUrl); - + NSURLProtectionSpace *protectionSpace = [NSURLProtectionSpace alloc]; NSString *host = [apiUrl host]; NSInteger port = [[apiUrl port] integerValue]; NSString *scheme = [apiUrl scheme]; [protectionSpace initWithHost:host port:port protocol:scheme realm:nil authenticationMethod:nil]; //NSLog(@"protectionSpace: %@", protectionSpace); - + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: apiUrl]; [request setHTTPMethod: method]; NSLog(@" - method: %@", method); @@ -50,7 +50,7 @@ - (NSURLConnection *) callUri:(NSString *)apiUriStub usingMethod:(NSString *)met } } NSLog(@" request: %@", request); - + // TODO: Find a better way around this! Would be ideal to detect the problem, prompt user before continuing, and allow only for the appropriate request; a la Safari's invalid-certificate handling. @try { [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[apiUrl host]]; @@ -62,7 +62,7 @@ - (NSURLConnection *) callUri:(NSString *)apiUriStub usingMethod:(NSString *)met [self abort]; connection = [[NSURLConnection connectionWithRequest:request delegate:delegate] retain]; //NSLog(@" connection: %@", connection); - + return connection; } diff --git a/Classes/Model/Shout.h b/Classes/Model/Shout.h index cc05b3f..cbcf50b 100644 --- a/Classes/Model/Shout.h +++ b/Classes/Model/Shout.h @@ -16,7 +16,7 @@ NSNumber *shoutId; IconCache *iconCache; UIImage *icon; - + // Start dictionary keys NSString *address1; NSString *address2; diff --git a/Classes/ShoutDetailController.h b/Classes/ShoutDetailController.h index 7c529b1..9d6d10b 100644 --- a/Classes/ShoutDetailController.h +++ b/Classes/ShoutDetailController.h @@ -26,9 +26,9 @@ @property(nonatomic, retain) IBOutlet UILabel *personHandleLabel; @property(nonatomic, retain) IBOutlet UILabel *personNameLabel; @property(nonatomic, retain) IBOutlet UILabel *placeNameLabel; -//@property(nonatomic, retain) IBOutlet -//@property(nonatomic, retain) IBOutlet -//@property(nonatomic, retain) IBOutlet -//@property(nonatomic, retain) IBOutlet +//@property(nonatomic, retain) IBOutlet +//@property(nonatomic, retain) IBOutlet +//@property(nonatomic, retain) IBOutlet +//@property(nonatomic, retain) IBOutlet @end diff --git a/Classes/UI/ABTableViewCell.h b/Classes/UI/ABTableViewCell.h index 98dfa24..23be864 100644 --- a/Classes/UI/ABTableViewCell.h +++ b/Classes/UI/ABTableViewCell.h @@ -1,5 +1,5 @@ // Copyright (c) 2008 Loren Brichter -// +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -8,10 +8,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/Classes/UI/ABTableViewCell.m b/Classes/UI/ABTableViewCell.m index 3351ba3..225b674 100644 --- a/Classes/UI/ABTableViewCell.m +++ b/Classes/UI/ABTableViewCell.m @@ -1,5 +1,5 @@ // Copyright (c) 2008 Loren Brichter -// +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -8,10 +8,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: -// +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND diff --git a/Classes/UI/ListeningViewController.m b/Classes/UI/ListeningViewController.m index b5b1cbd..7f6a847 100644 --- a/Classes/UI/ListeningViewController.m +++ b/Classes/UI/ListeningViewController.m @@ -34,11 +34,11 @@ - (void) viewDidLoad { NSLog(@"Setting up shout manager..."); shoutManager = [[ShoutManager alloc] init]; - + NSLog(@"Setting up shouts data source..."); [shoutManager setWho:@"listening"]; ListeningDataSource *shoutsDataSource = [ListeningDataSource initWithManager:shoutManager controller:self]; - + NSLog(@"Setting up list view..."); [tableView setDataSource:shoutsDataSource]; [tableView setDelegate:shoutsDataSource]; @@ -52,7 +52,7 @@ - (void) viewDidLoad { - (void) viewWillAppear:(BOOL)animated { NSLog(@"ListeningViewController viewWillAppear"); [super viewWillAppear:animated]; - + // Start data retrieval NSLog(@"Starting shout retrieval..."); //[self refreshShoutList]; @@ -73,7 +73,7 @@ - (void) viewWillDisappear:(BOOL)animated { - (void) dataLoaded:(NSArray *)shouts { NSLog(@"ListeningViewController dataLoaded"); - + // Update tab bar item badge NSUInteger shoutCount = 0; if (shouts != nil) { @@ -81,12 +81,12 @@ - (void) dataLoaded:(NSArray *)shouts { } NSString *shoutCountS = [NSString stringWithFormat:@"%u", shoutCount]; [[self tabBarItem] setBadgeValue:shoutCountS]; - + // Update list view table [tableView setHidden:NO]; [tableView reloadData]; // [tableView performSelectorInBackground:@selector(reloadData) withObject:nil]; - + // Scroll to first shout // Reconsidering this, given auto-reload NSArray *visibleCells = [tableView visibleCells]; @@ -100,7 +100,7 @@ - (void) dataLoaded:(NSArray *)shouts { [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; [indexPath release]; } - + // Let user know we're done reloading [spinnerView stopAnimating]; if (isFirstLoad) { diff --git a/Classes/UI/NearbyViewController.m b/Classes/UI/NearbyViewController.m index efd4d02..b2418a1 100644 --- a/Classes/UI/NearbyViewController.m +++ b/Classes/UI/NearbyViewController.m @@ -28,11 +28,11 @@ - (void) dealloc { - (void) viewDidLoad { [super viewDidLoad]; - + // Set up data source shoutManager = [[ShoutManager alloc] init]; nearbyDataSource = [NearbyDataSource initWithManager:shoutManager controller:self]; - + // Set up map view NSLog(@"Setting up map view..."); mapView = (RMMapView *)[self view]; @@ -47,7 +47,7 @@ - (void) viewDidLoad { [mapContents setZoomBounds:0.5 maxZoom:125000]; [mapView setDelegate: self]; [self setView:mapView]; - + } - (void) viewWillAppear:(BOOL)animated { @@ -57,7 +57,7 @@ - (void) viewWillAppear:(BOOL)animated { [LocationManager setDelegate:self]; NSLog(@" - NearbyViewController starting location updates..."); [LocationManager startUpdating]; - + // Start data retrieval //NSLog(@"Starting shout retrieval..."); // [spinnerView startAnimating]; @@ -191,7 +191,7 @@ - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLoc NSLog(@" - NearbyViewController updating with location: %@", newLocation); CLLocationCoordinate2D coordinate = newLocation.coordinate; [[mapView contents] setMapCenter:coordinate]; - + NSLog(@" - Starting shout retrieval..."); // Start data retrieval [self refreshShoutList]; diff --git a/Classes/UI/ShoutListCell.m b/Classes/UI/ShoutListCell.m index fbf7e67..d854a21 100644 --- a/Classes/UI/ShoutListCell.m +++ b/Classes/UI/ShoutListCell.m @@ -70,7 +70,7 @@ - (void)drawContentView:(CGRect)r { //CFAbsoluteTime currentMethodStart = CFAbsoluteTimeGetCurrent(); NSArray *mySizes = [allSizes objectForKey:shoutId]; //NSLog(@" - mySizes: %@", mySizes); - + CGContextRef context = UIGraphicsGetCurrentContext(); UIColor *backgroundColor = [UIColor whiteColor]; UIColor *textColor = [UIColor blackColor]; @@ -78,14 +78,14 @@ - (void)drawContentView:(CGRect)r { backgroundColor = [UIColor clearColor]; textColor = [UIColor whiteColor]; } - + // Fill cell with background color [backgroundColor set]; CGContextFillRect(context, r); - + // Draw user's icon [[shout icon] drawAtPoint:CGPointMake(SHOUTCELL_MARGIN_HORIZONTAL, SHOUTCELL_MARGIN_VERTICAL)]; - + [textColor set]; //float messageWidth = [[mySizes objectAtIndex:0] floatValue]; float messageHeight = [[mySizes objectAtIndex:1] floatValue]; @@ -93,7 +93,7 @@ - (void)drawContentView:(CGRect)r { //NSLog(@" - messageHeight: %f", messageHeight); CGRect firstRect = CGRectMake(LABEL_ORIGIN_X, SHOUTCELL_MARGIN_VERTICAL, labelWidth, messageHeight); CGSize firstSizeDrawn = [message drawInRect:firstRect withFont:messageFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft]; - + //CGSize ageSize = [age sizeWithFont:ageFont constrainedToSize:maxTextSize lineBreakMode:UILineBreakModeWordWrap]; //float ageWidth = ageSize.width; float ageWidth = [[mySizes objectAtIndex:2] floatValue]; @@ -109,7 +109,7 @@ - (void)drawContentView:(CGRect)r { ageY = MAX(ageMinY, ageY); //NSLog(@" - ageY: %f", ageY); CGRect ageRect = CGRectMake(ageX, ageY, ageWidth, ageHeight); - //CGSize ageSizeDrawn = + //CGSize ageSizeDrawn = [age drawInRect:ageRect withFont:ageFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentRight]; //NSLog(@" - ageSizeDrawn.width: %f", ageSizeDrawn.width); //NSLog(@" - ageSizeDrawn.height: %f", ageSizeDrawn.height); @@ -151,7 +151,7 @@ + (CGFloat) heightForShout:(Shout *)shout { NSString *shoutId = [shout shouts_history_id]; NSString *message = [ShoutListCell messageForShout: shout]; NSString *age = [shout relativeShoutTime]; - + BOOL calculate = YES; NSMutableArray *mySizes = [allSizes objectForKey:shoutId]; if (mySizes != nil) { @@ -168,7 +168,7 @@ + (CGFloat) heightForShout:(Shout *)shout { NSLog(@" - new : %@ %@", message, age); } } - if (calculate) { + if (calculate) { //NSLog(@" - creating new mySizes"); mySizes = [[NSMutableArray alloc] initWithCapacity:5]; //NSLog(@" - mySizes: %@", mySizes); @@ -182,11 +182,11 @@ + (CGFloat) heightForShout:(Shout *)shout { [mySizes addObject:messageHeightNSN]; [messageWidthNSN release]; [messageHeightNSN release]; - + // Text height, plus vertical margins above and below result = (SHOUTCELL_MARGIN_VERTICAL * 2) + messageSize.height; //NSLog(@" - result: %f", result); - + CGSize ageSize = [age sizeWithFont:ageFont constrainedToSize:maxTextSize lineBreakMode:UILineBreakModeWordWrap]; NSNumber *ageWidthNSN = [[NSNumber alloc] initWithFloat:ageSize.width]; NSNumber *ageHeightNSN = [[NSNumber alloc] initWithFloat:ageSize.height]; @@ -194,21 +194,21 @@ + (CGFloat) heightForShout:(Shout *)shout { [mySizes addObject:ageHeightNSN]; [ageWidthNSN release]; [ageHeightNSN release]; - + // Add this text's height plus a final bottom margin. result += ageSize.height + SHOUTCELL_MARGIN_VERTICAL; //NSLog(@" - result: %f", result); - + result = MAX(result, CELL_HEIGHT_MIN); // at least one row //NSLog(@" - result: %f", result); NSNumber *cellHeightNSN = [[NSNumber alloc] initWithFloat:result]; [mySizes addObject:cellHeightNSN]; [cellHeightNSN release]; - + // For later comparison [mySizes addObject:message]; [mySizes addObject:age]; - + //NSLog(@" - mySizes: %@", mySizes); [allSizes setValue:mySizes forKey:shoutId]; [mySizes release]; diff --git a/Classes/Utility/IconCache.m b/Classes/Utility/IconCache.m index cf086ad..fd38da5 100644 --- a/Classes/Utility/IconCache.m +++ b/Classes/Utility/IconCache.m @@ -44,11 +44,11 @@ - (NSString *) nameForAddress:(NSString *)iconAddress { //unichar newChar; unichar oldChar; for (int i = 0; i < length; i++) { - //newChar = + //newChar = oldChar = characters[i]; //NSLog(@" - character: %C", character); if (oldChar < 48 || (oldChar > 57 && oldChar < 65) || (oldChar > 90 && oldChar < 97) || oldChar > 122) { - //newChar = + //newChar = characters[i] = SPACER_CHARACTER; } //NSLog(@" - character: %C %C", oldChar, newChar); @@ -93,7 +93,7 @@ - (UIImage *) iconForAddress:(NSString *)iconAddress { } icon = [roundedIcon retain]; NSData *iconPngData = UIImagePNGRepresentation(icon); - //BOOL cacheWriteResult = + //BOOL cacheWriteResult = [iconPngData writeToFile:thisFilePath atomically:YES]; //BOOL cacheWriteResult = [icons writeToFile:diskCachePath atomically:YES]; //NSLog(@" - write to disk cache: %d", cacheWriteResult); diff --git a/Classes/Utility/ImageManipulator.m b/Classes/Utility/ImageManipulator.m index 020c0db..3dccd96 100644 --- a/Classes/Utility/ImageManipulator.m +++ b/Classes/Utility/ImageManipulator.m @@ -39,23 +39,23 @@ +(UIImage *) makeRoundCornerImage:(UIImage*)img :(int)cornerWidth :(int)cornerHe { int w = img.size.width; int h = img.size.height; - + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); - + CGContextBeginPath(context); CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height); addRoundedRectToPath(context, rect, cornerWidth, cornerHeight); CGContextClosePath(context); CGContextClip(context); - + CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); - + CGImageRef imageMasked = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); //[img release]; - + UIImage *result = [UIImage imageWithCGImage:imageMasked]; CGImageRelease(imageMasked); return result; diff --git a/docs/plan.rtf b/docs/plan.rtf index 4c1a2e1..4fd948c 100644 --- a/docs/plan.rtf +++ b/docs/plan.rtf @@ -25,13 +25,13 @@ The plan:\ \pard\tx220\tx720\tx1120\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\ql\qnatural\pardirnatural \ls1\ilvl0\cf0 {\listtext 2. }"Nearby"\ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\ql\qnatural\pardirnatural -\ls1\ilvl1\cf0 \strike \strikec2 {\listtext \uc0\u8259 }Pushpin for each shout +\ls1\ilvl1\cf0 \strike \strikec2 {\listtext \uc0\u8259 }Pushpin for each shout \b [done] \b0 \ -{\listtext \uc0\u8259 }Limited to 50 most recent shouts +{\listtext \uc0\u8259 }Limited to 50 most recent shouts \b [done] \b0 \ -{\listtext \uc0\u8259 }Pushpins fade with age, with boundaries such as: +{\listtext \uc0\u8259 }Pushpins fade with age, with boundaries such as: \b [done] \b0 \ \pard\tx1660\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li2160\fi-2160\ql\qnatural\pardirnatural @@ -39,7 +39,7 @@ The plan:\ {\listtext \uc0\u8259 }8 hours or more: 50% opacity\ {\listtext \uc0\u8259 }Linear gradient in between\ \pard\tx940\tx1440\tx1680\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\ql\qnatural\pardirnatural -\ls1\ilvl1\cf0 {\listtext \uc0\u8259 }Filtered to only display most recent shout for each person +\ls1\ilvl1\cf0 {\listtext \uc0\u8259 }Filtered to only display most recent shout for each person \b [done]\ \ls1\ilvl1 \b0 \strike0\striked0 {\listtext \uc0\u8259 }Combine shouts from the same location\ diff --git a/docs/shizzow-api-places-json.html b/docs/shizzow-api-places-json.html index 68f4283..63d605e 100644 --- a/docs/shizzow-api-places-json.html +++ b/docs/shizzow-api-places-json.html @@ -692,7 +692,7 @@ .vpws_ac_over .vpws_new { color: #DCECFF; } - + .vpws_ac_results { padding: 0px; border-top: 1px solid #ccc; @@ -719,15 +719,15 @@ color: #333333; cursor: default; display: block; - /* - if width will be 100% horizontal scrollbar will apear + /* + if width will be 100% horizontal scrollbar will apear when scroll mode will be used */ /*width: 100%;*/ font: menu; font-size: 12px; - /* - it is very important, if line-height not setted or setted + /* + it is very important, if line-height not setted or setted in relative units scroll will be broken in firefox */ line-height: 17px; @@ -776,7 +776,7 @@ background-color: #0376CE; color: #FFFFFF; } - + .vpws_profile { color: #0376CE; font-size: 90%; @@ -810,7 +810,7 @@
Share this tool:
-
+
digg
-
+
Stumble Upon
-
+
del.icio.us
-
+
Technorati
-
+
- E-mail
-
+ E-mail
+