Advertise Mobile SDKs Books Events Forum News Social Networking Support Us
Follow @iphonedevsdk on Twitter

Interface 2, Advanced iOS
Mockup & Code Gen
($9.99)

Make your own iPhone apps
and run them live!
(free)

Pic Frame Dynamo: Photo Editing
($0.99)

Abiliator
($1.99)

Want your application or service advertised on iPhone Dev SDK?

Go Back   iPhone Dev SDK Forum > iPhone SDK Development Forums > iPhone SDK Development

Reply
 
LinkBack Thread Tools Display Modes
Old 02-01-2012, 10:48 AM   #1 (permalink)
iPhone Developer
 
djbrooks111's Avatar
 
Join Date: Sep 2010
Posts: 25
djbrooks111 is on a distinguished road
Default Facebook SDK iOS Integration help

Hello developers!

I have come to you guys in the past with problems and you guys helped me when I needed it the most. Now I once again come to you with a problem, but this problem involves the Facebook SDK and its integration with my iPhone app.

Here is what I want to do:

I want to retrieve the user of my app's Facebook friends and their friends' profile pictures. I then want to display both the name and profile picture of those people in a random way, but do to download speed and people having a ton of friends, I only want to download 10 friends at a time. I have already started, trying to implement Facebook into my app, and I am not getting that far. I have been able to have the user authenticate with Facebook, but can't really go farther than that.

I am posting parts of my files below in the hopes that someone can spot where i am messing up.

Here is my AppDelegate.h

Code:
#import <UIKit/UIKit.h>
#import "FBConnect.h"
#import "FBRequest.h"

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate, FBSessionDelegate, FBRequestDelegate> {
    Facebook *facebook;
}

@property (nonatomic, retain) Facebook *facebook;

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end
Here is my AppDelegate.m

Code:
//FACEBOOK
// Pre 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [facebook handleOpenURL:url]; 
}

// For 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [facebook handleOpenURL:url]; 
}
- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccess-TokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpiration-DateKey"];
    [defaults synchronize];
    NSLog(@"fbDidLogin finished");
    
    Game *myGame = [[Game alloc] init];
    [myGame getFacebookStuff];
    NSLog(@"getFacebookStuff mentioned");
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //FACEBOOK
    facebook = [[Facebook alloc] initWithAppId:@"164730030304096" andDelegate:self];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.facebook = facebook;
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    
    return YES;
}
One of the problems that I have encountered so far, is that in my AppDelegate.m, my NSLog of "getFacebookStuff mentioned" does get outputted to my log, however, the NSLog that I have in the getFacebookStuff method, located in my Game class, does not get outputted.

Here is my Game.h

Code:
#import <UIKit/UIKit.h>
#import "FBConnect.h"
#import "FBRequest.h"

@interface Game : UIViewController <FBRequestDelegate> {
    Facebook *facebook;
    
    NSArray         *userInfoArray;
    NSMutableArray  *userIdArray;
    NSMutableArray  *userNameArray;
    NSMutableArray  *userPictureArray;
    NSMutableArray  *userGenderArray;
    NSDictionary    *individualUserInfo;
}

-(void)getFacebookStuff;
-(IBAction)start:(id)sender;

@property (nonatomic, retain) Facebook *facebook;

@end
And finally, here is my Game.m

Code:
#import "Game.h"
#import "AppDelegate.h"

@implementation Game

@synthesize facebook;

-(IBAction)start:(id)sender {
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    
    appDelegate.facebook = facebook;
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }
    if (![facebook isSessionValid]) {
        NSArray *permissions = [[NSArray alloc] initWithObjects:@"friends_photos", nil];
        [facebook authorize:permissions];
        
        
        NSLog(@"Getting permissions");
        
        [permissions release];
    }
    NSLog(@"Reached end of start setup");
    
    [startButton removeFromSuperview];
}

-(void)getFacebookStuff {
    NSLog(@"getFacebookStuff called");
    //FACEBOOK
    [facebook requestWithGraphPath:@"me/friends" andDelegate:self];
    NSLog(@"Reached facebook request for stuff and end of start method");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    //FACEBOOK
    facebook = [[Facebook alloc] initWithAppId:@"164730030304096" andDelegate:(AppDelegate *) [[UIApplication sharedApplication] delegate]];
}

//FACEBOOK
-(void)request:(FBRequest *)request didLoad:(id)result {
    NSLog(@"reached request method");
    
    if ([result isKindOfClass:[NSDictionary class]]) {
        userInfoArray = [result objectForKey:@"data"];
        userIdArray = [[NSMutableArray alloc] init];
        userNameArray = [[NSMutableArray alloc] init];
        userPictureArray = [[NSMutableArray alloc] init];
        userGenderArray = [[NSMutableArray alloc] init];
        
        for (int indexVal = 0; indexVal < [userInfoArray count]; indexVal++) {
            individualUserInfo = [userInfoArray objectAtIndex:indexVal];
            
            [userIdArray addObject:[individualUserInfo objectForKey:@"id"]];
            [userNameArray addObject:[individualUserInfo objectForKey:@"name"]];
            [userPictureArray addObject:[individualUserInfo objectForKey:@"picture"]];
            [userGenderArray addObject:[individualUserInfo objectForKey:@"gender"]];
            
            NSLog(@"Friend Name Array : %@ ",userNameArray);
            NSLog(@"ID Array : %@ ",userIdArray);
            NSLog(@"Gender Array : %@ ",userGenderArray);
        }
    }
}

//FACEBOOK
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"received response");
}

//FACEBOOK
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"Err message: %@", [[error userInfo] objectForKey:@"error_msg"]);
    NSLog(@"Err code: %d", [error code]);
}
This is what my program outputs in the logs when it runs:

Code:
2012-02-01 11:45:52.852 AppName[11091:f803] Getting permissions
2012-02-01 11:45:52.853 AppName[11091:f803] Reached end of start setup
2012-02-01 11:45:58.280 AppName[11091:f803] fbDidLogin finished
2012-02-01 11:45:58.281 AppName[11091:f803] getFacebookStuff called
2012-02-01 11:45:58.282 AppName[11091:f803] Reached facebook request for stuff and end of start method
2012-02-01 11:45:58.282 AppName[11091:f803] getFacebookStuff mentioned
Terminating in response to SpringBoard's termination.
Program ended with exit code: 0
Any help at all would be very much appreciated! I have looked online at multiple sources but none of them have given me an answer.

Thanks a lot,

David Brooks
djbrooks111 is offline   Reply With Quote
Old 02-01-2012, 01:45 PM   #2 (permalink)
Registered Member
 
apatsufas's Avatar
 
Join Date: Jan 2011
Location: Thessaloniki, Greece
Posts: 121
apatsufas is on a distinguished road
Default

The problem is, I think, that you are creating to Facebook objects.

One in your didFinishLaunchingWithOptions function and one in Game.m viewDidLoad function.

As I see it, the one gets authorized and the other not so you can't download your users friends.

What you can do is either use a singleton which will hold the Facebook object so that it is accessible everywhere in your app, which is the best option in my opinion,

or just use the Facebook object which you initialize in your AppDelegate,

or pass the Facebook object to the Game view controller through the facebook property you have declared.

For the first option I would suggest, if you don't already know how to use singletons, to look up DuncanC's tutorial in this forum.

For the second option get rid of the Facebook property and instance variable in Game.h and use appDelegate.facebook

For the third option get rid of this line
Code:
facebook = [[Facebook alloc] initWithAppId:@"164730030304096" andDelegate:(AppDelegate *) [[UIApplication sharedApplication] delegate]];
in Game.m viewDidLoad function and add this
Code:
myGame.facebook = self.facebook;
right after
Code:
Game *myGame = [[Game alloc] init];
in AppDelegate.m fbDidLogin function
__________________
SQLed - Your Database Manager on the go

iAZConverter - Converts everything from A to Z
apatsufas is offline   Reply With Quote
Old 02-01-2012, 01:51 PM   #3 (permalink)
Registered Member
 
apatsufas's Avatar
 
Join Date: Jan 2011
Location: Thessaloniki, Greece
Posts: 121
apatsufas is on a distinguished road
Default

Also
Code:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //FACEBOOK
    facebook = [[Facebook alloc] initWithAppId:@"164730030304096" andDelegate:self];

//This is overkill. You are already in the AppDelegate. There is no need to reference it again. Delete those two lines they are unnecessary
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.facebook = facebook;
__________________
SQLed - Your Database Manager on the go

iAZConverter - Converts everything from A to Z
apatsufas is offline   Reply With Quote
Old 02-01-2012, 02:19 PM   #4 (permalink)
iPhone Developer
 
djbrooks111's Avatar
 
Join Date: Sep 2010
Posts: 25
djbrooks111 is on a distinguished road
Default

Quote:
Originally Posted by apatsufas View Post
Also
Code:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //FACEBOOK
    facebook = [[Facebook alloc] initWithAppId:@"164730030304096" andDelegate:self];

//This is overkill. You are already in the AppDelegate. There is no need to reference it again. Delete those two lines they are unnecessary
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.facebook = facebook;
Thanks for all the help so far apatsufas, but do you know how I can limit the number of friends that it downloads? Can i only have it download ten friends at a time?

Also, I edited somethings to make the facebook authenticate on a certain view, but now I get some weird errors :

Code:
2012-02-01 15:23:01.376 AppName[11465:f803] Getting permissions
2012-02-01 15:23:01.377 AppName[11465:f803] Reached end of start setup
2012-02-01 15:23:06.660 AppName[11465:f803] fbDidLogin finished
2012-02-01 15:23:06.660 AppName[11465:f803] getFacebookStuff called
2012-02-01 15:23:06.664 AppName[11465:f803] Reached facebook request for stuff and end of start method
2012-02-01 15:23:06.664 AppName[11465:f803] getFacebookStuff mentioned
2012-02-01 15:23:08.250 AppName[11465:f803] received response
2012-02-01 15:23:08.562 AppName[11465:f803] reached request method
2012-02-01 15:23:08.563 AppName[11465:f803] class of request : FBRequest 
2012-02-01 15:23:08.564 AppName[11465:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
Here is what I have in my request method that I believe the error is being thrown on:

Code:
-(void)request:(FBRequest *)request didLoad:(id)result {
    NSLog(@"reached request method");
    NSLog(@"class of request : %@ ",request.class);
    
    if ([result isKindOfClass:[NSDictionary class]]) {
        userInfoArray = [result objectForKey:@"data"];
        userIdArray = [[NSMutableArray alloc] init];
        userNameArray = [[NSMutableArray alloc] init];
        userPictureArray = [[NSMutableArray alloc] init];
        userGenderArray = [[NSMutableArray alloc] init];
        
        for (int indexVal = 0; indexVal < [userInfoArray count]; indexVal++) {
            individualUserInfo = [userInfoArray objectAtIndex:indexVal];
            
            [userIdArray addObject:[individualUserInfo objectForKey:@"id"]];
            [userNameArray addObject:[individualUserInfo objectForKey:@"name"]];
            [userPictureArray addObject:[individualUserInfo objectForKey:@"picture"]];
            [userGenderArray addObject:[individualUserInfo objectForKey:@"gender"]];
            
            NSLog(@"Friend Name Array : %@ ",userNameArray);
            NSLog(@"ID Array : %@ ",userIdArray);
            NSLog(@"Gender Array : %@ ",userGenderArray);
        }
    }
}
__________________
Check out my current apps!

Drinking Games!
Never Have I Ever
Never Have I Ever HD (iPad)
Love/Hate

Last edited by djbrooks111; 02-01-2012 at 02:27 PM. Reason: Added another error to this point instead of making a separate post
djbrooks111 is offline   Reply With Quote
Old 02-01-2012, 04:13 PM   #5 (permalink)
Registered Member
 
apatsufas's Avatar
 
Join Date: Jan 2011
Location: Thessaloniki, Greece
Posts: 121
apatsufas is on a distinguished road
Default

I don't know how to limit the number of friends that are downloaded.

Now about the error. One of these
Code:
[individualUserInfo objectForKey:@"id"];
[individualUserInfo objectForKey:@"name"];
[individualUserInfo objectForKey:@"picture"];
[individualUserInfo objectForKey:@"gender"];
returns nil.

Check everyone of those if it is nil before you add them to your arrays.
__________________
SQLed - Your Database Manager on the go

iAZConverter - Converts everything from A to Z
apatsufas is offline   Reply With Quote
Old 02-01-2012, 04:22 PM   #6 (permalink)
iPhone Developer
 
djbrooks111's Avatar
 
Join Date: Sep 2010
Posts: 25
djbrooks111 is on a distinguished road
Default

Quote:
Originally Posted by apatsufas View Post
I don't know how to limit the number of friends that are downloaded.

Now about the error. One of these
Code:
[individualUserInfo objectForKey:@"id"];
[individualUserInfo objectForKey:@"name"];
[individualUserInfo objectForKey:@"picture"];
[individualUserInfo objectForKey:@"gender"];
returns nil.

Check everyone of those if it is nil before you add them to your arrays.
And how do I go about doing that, sorry to ask, but I haven't worked with Arrays before.
__________________
Check out my current apps!

Drinking Games!
Never Have I Ever
Never Have I Ever HD (iPad)
Love/Hate
djbrooks111 is offline   Reply With Quote
Old 02-01-2012, 04:29 PM   #7 (permalink)
Registered Member
 
apatsufas's Avatar
 
Join Date: Jan 2011
Location: Thessaloniki, Greece
Posts: 121
apatsufas is on a distinguished road
Default

Simply check
Code:
if([individualUserInfo objectForKey:@"id"])
etc.
for every key before adding the objects to your arrays.
__________________
SQLed - Your Database Manager on the go

iAZConverter - Converts everything from A to Z
apatsufas is offline   Reply With Quote
Old 02-02-2012, 01:30 PM   #8 (permalink)
iPhone Developer
 
djbrooks111's Avatar
 
Join Date: Sep 2010
Posts: 25
djbrooks111 is on a distinguished road
Default

Quote:
Originally Posted by apatsufas View Post
Simply check
Code:
if([individualUserInfo objectForKey:@"id"])
etc.
for every key before adding the objects to your arrays.
So I did exactly as you said to do, and it is still not working...

Here is what the console says:

Code:
2012-02-02 14:25:34.237 AppName[13020:f803] Getting permissions
2012-02-02 14:25:34.238 AppName[13020:f803] Reached end of start setup
2012-02-02 14:25:39.470 AppName[13020:f803] fbDidLogin finished
2012-02-02 14:25:39.471 AppName[13020:f803] getFacebookStuff called
2012-02-02 14:25:39.474 AppName[13020:f803] Reached facebook request for stuff and end of start method
2012-02-02 14:25:39.475 AppName[13020:f803] getFacebookStuff mentioned
2012-02-02 14:25:40.785 AppName[13020:f803] received response
2012-02-02 14:25:40.974 AppName[13020:f803] reached request method
2012-02-02 14:25:40.974 AppName[13020:f803] class of request : FBRequest 
2012-02-02 14:25:40.975 AppName[13020:f803] Request failed for some reason
Terminating in response to SpringBoard's termination.
Program ended with exit code: 0
Here is the code in my Game.m file where the error is:

Code:
-(void)request:(FBRequest *)request didLoad:(id)result {
    NSLog(@"reached request method");
    NSLog(@"class of request : %@ ",request.class);
    
    if ([result isKindOfClass:[NSDictionary class]]) {
        userInfoArray = [result objectForKey:@"data"];
        userIdArray = [[NSMutableArray alloc] init];
        userNameArray = [[NSMutableArray alloc] init];
        userPictureArray = [[NSMutableArray alloc] init];
        userGenderArray = [[NSMutableArray alloc] init];
        
        if ([individualUserInfo objectForKey:@"id"] && [individualUserInfo objectForKey:@"name"] && [individualUserInfo objectForKey:@"picture"] && [individualUserInfo objectForKey:@"gender"]) {
        
            for (int indexVal = 0; indexVal < [userInfoArray count]; indexVal++) {
                individualUserInfo = [userInfoArray objectAtIndex:indexVal];
            
                    [userIdArray addObject:[individualUserInfo objectForKey:@"id"]];
                    [userNameArray addObject:[individualUserInfo objectForKey:@"name"]];
                    [userPictureArray addObject:[individualUserInfo objectForKey:@"picture"]];
                    [userGenderArray addObject:[individualUserInfo objectForKey:@"gender"]];
                
                    NSLog(@"Friend Name Array : %@ ",userNameArray);
                    NSLog(@"ID Array : %@ ",userIdArray);
                    NSLog(@"Gender Array : %@ ",userGenderArray);
            }
            NSLog(@"Success in getting info");
        } else {
            NSLog(@"Request failed for some reason");
        }
    }
}
Thanks for all you help again!
__________________
Check out my current apps!

Drinking Games!
Never Have I Ever
Never Have I Ever HD (iPad)
Love/Hate
djbrooks111 is offline   Reply With Quote
Old 02-02-2012, 01:42 PM   #9 (permalink)
Registered Member
 
apatsufas's Avatar
 
Join Date: Jan 2011
Location: Thessaloniki, Greece
Posts: 121
apatsufas is on a distinguished road
Default

Quote:
Originally Posted by djbrooks111 View Post
So I did exactly as you said to do, and it is still not working...

Here is what the console says:

Code:
2012-02-02 14:25:34.237 AppName[13020:f803] Getting permissions
2012-02-02 14:25:34.238 AppName[13020:f803] Reached end of start setup
2012-02-02 14:25:39.470 AppName[13020:f803] fbDidLogin finished
2012-02-02 14:25:39.471 AppName[13020:f803] getFacebookStuff called
2012-02-02 14:25:39.474 AppName[13020:f803] Reached facebook request for stuff and end of start method
2012-02-02 14:25:39.475 AppName[13020:f803] getFacebookStuff mentioned
2012-02-02 14:25:40.785 AppName[13020:f803] received response
2012-02-02 14:25:40.974 AppName[13020:f803] reached request method
2012-02-02 14:25:40.974 AppName[13020:f803] class of request : FBRequest 
2012-02-02 14:25:40.975 AppName[13020:f803] Request failed for some reason
Terminating in response to SpringBoard's termination.
Program ended with exit code: 0
Here is the code in my Game.m file where the error is:

Code:
-(void)request:(FBRequest *)request didLoad:(id)result {
    NSLog(@"reached request method");
    NSLog(@"class of request : %@ ",request.class);
    
    if ([result isKindOfClass:[NSDictionary class]]) {
        userInfoArray = [result objectForKey:@"data"];
        userIdArray = [[NSMutableArray alloc] init];
        userNameArray = [[NSMutableArray alloc] init];
        userPictureArray = [[NSMutableArray alloc] init];
        userGenderArray = [[NSMutableArray alloc] init];
        
        if ([individualUserInfo objectForKey:@"id"] && [individualUserInfo objectForKey:@"name"] && [individualUserInfo objectForKey:@"picture"] && [individualUserInfo objectForKey:@"gender"]) {
        
            for (int indexVal = 0; indexVal < [userInfoArray count]; indexVal++) {
                individualUserInfo = [userInfoArray objectAtIndex:indexVal];
            
                    [userIdArray addObject:[individualUserInfo objectForKey:@"id"]];
                    [userNameArray addObject:[individualUserInfo objectForKey:@"name"]];
                    [userPictureArray addObject:[individualUserInfo objectForKey:@"picture"]];
                    [userGenderArray addObject:[individualUserInfo objectForKey:@"gender"]];
                
                    NSLog(@"Friend Name Array : %@ ",userNameArray);
                    NSLog(@"ID Array : %@ ",userIdArray);
                    NSLog(@"Gender Array : %@ ",userGenderArray);
            }
            NSLog(@"Success in getting info");
        } else {
            NSLog(@"Request failed for some reason");
        }
    }
}
Thanks for all you help again!
Your if statement
Code:
if ([individualUserInfo objectForKey:@"id"] && [individualUserInfo objectForKey:@"name"] && [individualUserInfo objectForKey:@"picture"] && [individualUserInfo objectForKey:@"gender"]) {
will always be false because individualUserInfo has no values at that point.
Code:
            for (int indexVal = 0; indexVal < [userInfoArray count]; indexVal++) {
                individualUserInfo = [userInfoArray objectAtIndex:indexVal];
You are passing a value to individualUserInfo after the if statement.

So move the if statement after individualUserInfo = [userInfoArray objectAtIndex:indexVal];
__________________
SQLed - Your Database Manager on the go

iAZConverter - Converts everything from A to Z
apatsufas is offline   Reply With Quote
Old 02-02-2012, 04:13 PM   #10 (permalink)
iPhone Developer
 
djbrooks111's Avatar
 
Join Date: Sep 2010
Posts: 25
djbrooks111 is on a distinguished road
Default

So i discovered what the problem was. When i was making the request over to Facebook, I was only asking for "me/friends" when I needed a more specific parameter to ask for which is "me/friends?access_token=[oauth_token]&fields=name,id,picture,gender"

Thanks for all your help apatsufas, I really appreciate it!

P.S. I am still stuck on how to limit the number of friends that it downloads per request.
__________________
Check out my current apps!

Drinking Games!
Never Have I Ever
Never Have I Ever HD (iPad)
Love/Hate

Last edited by djbrooks111; 02-02-2012 at 04:20 PM.
djbrooks111 is offline   Reply With Quote
Reply

Bookmarks

Tags
facebook api, facebook connect

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



» Advertisements
» Online Users: 420
17 members and 403 guests
Atatator, chiataytuday, condor304, dre, FrankWeller, imac74, ipodphone, jeroenkeij, kukat, LunarMoon, MAMN84, n00b, PowerGoofy, QuantumDoja, Retouchable, tim0504, VinceYuan
Most users ever online was 1,387, 04-10-2012 at 04:21 AM.
» Stats
Members: 175,675
Threads: 94,124
Posts: 402,909
Top Poster: BrianSlick (7,990)
Welcome to our newest member, Retouchable
Powered by vBadvanced CMPS v3.1.0

All times are GMT -5. The time now is 06:03 AM.
Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0