//
//  MenuTableViewController.m
//  DUREX Vendor Control
//
//  Created by Imanol Barba on 5/23/14.
//  Copyright (c) 2014 Emmoco. All rights reserved.
//

#import "MenuTableViewController.h"

@interface MenuTableViewController ()
{
    IBOutlet UIActivityIndicatorView *_activityIndicator;
    NSTimer *_writeTimer;
}

//NAVIGATION LEVELS LAYOUT AND CELL IDENTIFIERS
@property (nonatomic,strong) const NSMutableArray *menuElements;
@property (nonatomic,strong) const NSMutableArray *menuStructure;
@property (nonatomic,strong) const NSMutableArray *menuHeaders;

@property (nonatomic,strong) const NSMutableArray *maintenanceElements;
@property (nonatomic,strong) const NSMutableArray *maintenanceStructure;
@property (nonatomic,strong) const NSMutableArray *maintenanceHeaders;

@property (nonatomic,strong) const NSMutableArray *saleListElements;
@property (nonatomic,strong) const NSMutableArray *saleListStructure;
@property (nonatomic,strong) const NSMutableArray *saleListHeaders;

@property (nonatomic,strong) const NSMutableArray *saleElements;
@property (nonatomic,strong) const NSMutableArray *saleStructure;
@property (nonatomic,strong) const NSMutableArray *saleHeaders;

@property (nonatomic,strong) const NSMutableArray *incidentListElements;
@property (nonatomic,strong) const NSMutableArray *incidentListStructure;
@property (nonatomic,strong) const NSMutableArray *incidentListHeaders;

@property (nonatomic,strong) const NSMutableArray *incidentElements;
@property (nonatomic,strong) const NSMutableArray *incidentStructure;
@property (nonatomic,strong) const NSMutableArray *incidentHeaders;

@property (nonatomic,strong) const NSMutableArray *configElements;
@property (nonatomic,strong) const NSMutableArray *configStructure;
@property (nonatomic,strong) const NSMutableArray *configHeaders;

@property (nonatomic,strong) const NSArray *cellIdentifiers;

//NAVIGATION LEVEL ATTRIBUTES
@property (strong,nonatomic) NSMutableArray *childViewControllers;
@property uint8_t currentNavLevel;
@property Boolean showIndexes;
@property (strong,nonatomic) NSString *currentCellIdentifier;
@property (strong,nonatomic) const NSMutableArray *currentElements;
@property (strong,nonatomic) const NSMutableArray  *currentStructure;
@property (strong,nonatomic) const NSMutableArray *currentHeaders;

//GENERAL ATTRIBUTES
@property (nonatomic,strong) CommunicationProtocol* protocol;
@property (strong,nonatomic) NSString *machineMACAddr;
@property (strong,nonatomic) BTAppDelegate *appDelegate;
@property (strong,nonatomic) Stack *parentLayout;
@property (strong,nonatomic) NSTimer *timeoutTimer;
@property (strong,nonatomic) NSMutableArray *batchCommands;
@property (strong,nonatomic) Sensors *sensorStatus;
@property (strong,nonatomic) SalesLog *salesLog;
@property (strong,nonatomic) Sale *currentSale;
@property (strong,nonatomic) IncidentLog *incidentLog;
@property (strong,nonatomic) Incident *currentIncident;
@property uint8_t requestedLog;
@property uint8_t sentCommand;

//CHILD VIEW CONTOLLERS
@property (strong,nonatomic) DatePickerViewController *datePickerViewController;
@property (strong,nonatomic) PriceChangerViewController *priceChangerViewController;
@property (strong,nonatomic) NameChangerViewController *nameChangerViewController;
@property (strong,nonatomic) DateRangePickerViewController *dateRangePickerViewController;
@end

@implementation MenuTableViewController

//NAVIGATION LEVELS GENERATION AND NAVIGATION
- (void) initializeMenuEntries
{
    [self setMenuElements:[[NSMutableArray alloc] initWithObjects:MENU_ELEMENTS, nil]];
    [self setMenuStructure:[[NSMutableArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]];
    if([[self menuStructure] count] > 1)
    {
        [self setMenuHeaders:[[NSMutableArray alloc] initWithObjects:MENU_HEADERS, nil]];
    }
    else
    {
        [self setMenuHeaders:nil];
    }
    
    [self setConfigElements:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]];
    [self setConfigStructure:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]];
    if([[self configStructure] count] > 1)
    {
        [self setConfigHeaders:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]];
    }
    else
    {
        [self setConfigHeaders:nil];
    }
    
    [self setCellIdentifiers:[[NSArray alloc] initWithObjects:CELL_IDENTIFIERS, nil]];
}

- (void) generateMaintenanceLevel : (NSString *) response
{
    [self setSensorStatus:[[Sensors alloc]init]];
    [[self sensorStatus] setResponseValue:response];
    [self setMaintenanceElements:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]];
    [self setMaintenanceStructure:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]];
    if([[self maintenanceStructure] count] > 1)
    {
        [self setMaintenanceHeaders:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]];
    }
    else
    {
        [self setMaintenanceHeaders:nil];
    }
}

- (void) generateSaleListNavLevel : (NSString*) response
{
    [self setSalesLog:[[SalesLog alloc]init]];
    [[self salesLog] setResponseValue:response];
    NSMutableArray *dateArray = [[NSMutableArray alloc] init];
    NSMutableArray *dateHeaderArray = [[NSMutableArray alloc] init];
    NSMutableArray *dateStructure = [[NSMutableArray alloc] init];
    NSUInteger headerPos = 0;
    NSUInteger headerCount = 0;
    NSString *lastDate = @"";
    NSString *currentDate;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
    for(int i = 0; i < [[[self salesLog] sales]count]; i++)
    {
        Sale *currentSale = [[[self salesLog] sales]objectAtIndex:i];
        NSDateComponents *components = [calendar components:units fromDate:[currentSale saleTime]];
        [dateArray insertObject:[NSString stringWithFormat:@"[%d%d%d%d%d]%02d/%02d/%d %02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components day],[components month],[components year],[components hour],[components minute]] atIndex:i];
        currentDate = [NSString stringWithFormat:@"%02d/%d",[components month],[components year]];
        if([lastDate isEqualToString:@""])
        {
            headerCount = 1;
            lastDate = currentDate;
        }
        else if(![currentDate isEqualToString:lastDate])
        {
            [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos];
            [dateHeaderArray insertObject:lastDate atIndex:headerPos];
            headerCount = 1;
            headerPos++;
            lastDate = currentDate;
        }
        else
        {
            headerCount++;
        }
    }
    [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos];
    [dateHeaderArray insertObject:lastDate atIndex:headerPos];
    [self setSaleListElements:[[NSMutableArray alloc] initWithArray:dateArray]];
    [self setSaleListStructure:[[NSMutableArray alloc] initWithArray:dateStructure]];
    [self setSaleListHeaders:[[NSMutableArray alloc] initWithArray:dateHeaderArray]];
}

- (Boolean) generateSaleNavLevel : (NSInteger) numSale
{
    [self setSaleElements:[[NSMutableArray alloc] initWithObjects:SALE_ELEMENTS, nil]];
    [self setSaleStructure:[[NSMutableArray alloc] initWithObjects:SALE_CELLS_PER_SECTION, nil]];
    if([[self saleStructure] count] > 1)
    {
        [self setSaleHeaders:[[NSMutableArray alloc] initWithObjects:SALE_HEADERS, nil]];
    }
    else
    {
        [self setSaleHeaders:nil];
    }
    [self setCurrentSale:[[[self salesLog]sales]objectAtIndex:numSale]];
    return TRUE;
}

- (void) generateIncidentListNavLevel : (NSString*) response
{
    [self setIncidentLog:[[IncidentLog alloc]init]];
    [[self incidentLog] setResponseValue:response];
    NSMutableArray *dateArray = [[NSMutableArray alloc] init];
    NSMutableArray *dateHeaderArray = [[NSMutableArray alloc] init];
    NSMutableArray *dateStructure = [[NSMutableArray alloc] init];
    NSUInteger headerPos = 0;
    NSUInteger headerCount = 0;
    NSString *lastDate = @"";
    NSString *currentDate;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
    for(int i = 0; i < [[[self incidentLog] incidents]count]; i++)
    {
        Incident *currentIncident = [[[self incidentLog] incidents]objectAtIndex:i];
        NSDateComponents *components = [calendar components:units fromDate:[currentIncident incidentTime]];
        [dateArray insertObject:[NSString stringWithFormat:@"[%d%d%d%d%d]%02d/%02d/%d %02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components day],[components month],[components year],[components hour],[components minute]] atIndex:i];
        currentDate = [NSString stringWithFormat:@"%02d/%d",[components month],[components year]];
        if([lastDate isEqualToString:@""])
        {
            headerCount = 1;
            lastDate = currentDate;
        }
        else if(![currentDate isEqualToString:lastDate])
        {
            [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos];
            [dateHeaderArray insertObject:lastDate atIndex:headerPos];
            headerCount = 1;
            headerPos++;
            lastDate = currentDate;
        }
        else
        {
            headerCount++;
        }
    }
    [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos];
    [dateHeaderArray insertObject:lastDate atIndex:headerPos];    [self setIncidentListElements:[[NSMutableArray alloc] initWithArray:dateArray]];
    [self setIncidentListStructure:[[NSMutableArray alloc] initWithArray:dateStructure]];
    [self setIncidentListHeaders:[[NSMutableArray alloc] initWithArray:dateHeaderArray]];
}

- (Boolean) generateIncidentNavLevel : (NSInteger) numIncident
{
    [self setIncidentElements:[[NSMutableArray alloc] initWithObjects:INCIDENT_ELEMENTS, nil]];
    [self setIncidentStructure:[[NSMutableArray alloc] initWithObjects:INCIDENT_CELLS_PER_SECTION, nil]];
    if([[self incidentStructure] count] > 1)
    {
        [self setIncidentHeaders:[[NSMutableArray alloc] initWithObjects:INCIDENT_HEADERS, nil]];
    }
    else
    {
        [self setIncidentHeaders:nil];
    }
    [self setCurrentIncident:[[[self incidentLog]incidents]objectAtIndex:numIncident]];
    return TRUE;
}

- (void) changeNavLevel: (uint8_t) level : (BOOL) push
{
    NSLog(@"[MenuTableViewController.m]: Changing to navLevel %d",level);
    self.showIndexes = FALSE;
    if(push)
    {
        [[self parentLayout] push: [NSNumber numberWithUnsignedChar:self.currentNavLevel]];
    }
    [self setCurrentNavLevel:level];
    [self setCurrentCellIdentifier:[[self cellIdentifiers] objectAtIndex:[self currentNavLevel]]];
    if([self currentNavLevel] == MENU)
    {
        [self setMachineMACAddr:[[[EMConnectionManager sharedManager] connectedDevice] name]];
        [[self navigationItem] setTitle:[self machineMACAddr]];
        [self setCurrentElements:[self menuElements]];
        [self setCurrentStructure:[self menuStructure]];
        [self setCurrentHeaders:[self menuHeaders]];
    }
    else if([self currentNavLevel] == MAINTENANCE)
    {
        [[self navigationItem] setTitle:NSLocalizedString(@"Maintenance", nil)];
        [self setCurrentElements:[self maintenanceElements]];
        [self setCurrentStructure:[self maintenanceStructure]];
        [self setCurrentHeaders:[self maintenanceHeaders]];
    }
    else if([self currentNavLevel] == SALE_LIST)
    {
        self.showIndexes = TRUE;
        [[self navigationItem] setTitle:NSLocalizedString(@"Sales log", nil)];
        [self setCurrentElements:[self saleListElements]];
        [self setCurrentStructure:[self saleListStructure]];
        [self setCurrentHeaders:[self saleListHeaders]];
    }
    else if([self currentNavLevel] == SALE)
    {
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
        NSDateComponents *components = [calendar components:units fromDate:[[self currentSale] saleTime]];
        [[self navigationItem] setTitle:[NSString stringWithFormat:@"%@ %02d/%02d/%d %02d:%02d",NSLocalizedString(@"Sale on", nil),[components day],[components month],[components year],[components hour],[components minute]]];
        [self setCurrentElements:[self saleElements]];
        [self setCurrentStructure:[self saleStructure]];
        [self setCurrentHeaders:[self saleHeaders]];
    }
    else if([self currentNavLevel] == INCIDENT_LIST)
    {
        self.showIndexes = TRUE;
        [[self navigationItem] setTitle:NSLocalizedString(@"Incident log", nil)];
        [self setCurrentElements:[self incidentListElements]];
        [self setCurrentStructure:[self incidentListStructure]];
        [self setCurrentHeaders:[self incidentListHeaders]];
    }
    else if([self currentNavLevel] == INCIDENT)
    {
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
        NSDateComponents *components = [calendar components:units fromDate:[[self currentIncident] incidentTime]];
        [[self navigationItem] setTitle:[NSString stringWithFormat:@"%@ %02d/%02d/%d %02d:%02d",NSLocalizedString(@"Incident on", nil),[components day],[components month],[components year],[components hour],[components minute]]];
        [self setCurrentElements:[self incidentElements]];
        [self setCurrentStructure:[self incidentStructure]];
        [self setCurrentHeaders:[self incidentHeaders]];
    }
    else if([self currentNavLevel] == BASIC_CONFIGURATION)
    {
        [[self navigationItem] setTitle:NSLocalizedString(@"Basic Configuration", nil)];
        [self setCurrentElements:[self configElements]];
        [self setCurrentStructure:[self configStructure]];
        [self setCurrentHeaders:[self configHeaders]];
    }
    //AND SO ON...
    [self reloadTable:UITableViewRowAnimationAutomatic];
}

- (void) reloadTable: (UITableViewRowAnimation) animation
{
    [[self tableView] reloadData];
    NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:[self tableView]]);
    NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
    [[self tableView] reloadSections:sections withRowAnimation:animation];
}

- (void) navBack
{
    NSNumber *prevLevel = [[self parentLayout] pop];
    self.currentNavLevel = prevLevel.intValue;
    [self changeNavLevel: prevLevel.intValue : FALSE];
}

- (void) backButtonPressed: (id) sender
{
    NSLog(@"[MenuTableViewController.m]: Navigation Stack has %ld remaining levels",(long)[[self parentLayout] count]);
    if([[self parentLayout] count] > 0)
    {
        NSLog(@"[MenuTableViewController.m]: Falling to previous navigation level");
        [self navBack];
    }
    else
    {
        NSLog(@"[MenuTableViewController.m]: No more navigation levels in stack, falling to previous view");
        [_protocol disconnect];
        [self.navigationController popViewControllerAnimated:YES];
    }
}

//MAINTENANCE REPORT SENDING
- (void) sendMaintenanceReport : (NSString*) status : (NSString*) date : (NSString*) machineid
{
    NSString *content = [NSString stringWithFormat:@"status=%@&date=%@&machineid=%@",status,date,machineid];
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:REPORT_SERVER_URL]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[content dataUsingEncoding:NSUTF8StringEncoding]];
    [NSURLConnection connectionWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"[MenuTableViewController.m]: Received response from report server: %@",[NSString stringWithUTF8String:[data bytes]]);
   [self.view makeToast:NSLocalizedString(@"Report sent successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Success!", nil) image:[UIImage imageNamed:@"icon_checkmark"]];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"[MenuTableViewController.m]: Error connecting to server: %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
    [self.view makeToast:NSLocalizedString(@"Connection to server failed", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
}
//PROTOCOL ERROR CALLBACK
- (void) reportProtocolError: (CommunicationProtocol*)protocol didFinishEnteringItem:(NSString*) error
{
    if(self.currentNavLevel == 255)
    {
        [self processMessage:protocol didFinishEnteringItem:@"ERROR"];
    }
    else
    {
        [self.view makeToast:error duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
    }
}

//MESSAGE RECEIVED CALLBACK
- (void)processMessage:(CommunicationProtocol*)protocol didFinishEnteringItem:(NSString*) response
{
    NSLog(@"[MenuTableViewController.m]: Answer received: %@",response);
    [self.timeoutTimer invalidate];
    if(self.sentCommand == HELLO)
    {
        if([response isEqualToString:@"Hello"])
        {
            NSLog(@"[MenuTableViewController.m]: Connection established");
            [self changeNavLevel:MENU:FALSE];
        }
        else
        {
            NSLog(@"[CommunicationProtocol.m]: Error while establishing connection");
            UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Communication error",nil) message:NSLocalizedString(@"Error while trying to connect to the device",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
            [alert show];
            UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2];
            [[self navigationController] popToViewController:previous animated:YES];
        }
    }
    else if(self.sentCommand == A2 && [[response substringToIndex:2]isEqualToString:@"P2"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A2 answer");
        [self generateSaleListNavLevel : response];
        [self changeNavLevel:SALE_LIST:TRUE];
    }
    else if(self.sentCommand == A3 && [[response substringToIndex:2]isEqualToString:@"P3"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A3 answer");
        [self generateIncidentListNavLevel : response];
        [self changeNavLevel:INCIDENT_LIST:TRUE];
    }
    else if(self.sentCommand == A4 && [[response substringToIndex:2]isEqualToString:@"P4"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A4 answer");
        [self generateMaintenanceLevel : response];
        [self changeNavLevel:MAINTENANCE:TRUE];
    }
    else if(self.sentCommand == A5 && [[response substringToIndex:2]isEqualToString:@"P5"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A5 answer");
        if([response isEqualToString:@"P51"])
        {
            [self.view makeToast:NSLocalizedString(@"Time and Date changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]];
        }
        else if([response isEqualToString:@"P52"])
        {
            NSLog(@"[MenuTableViewController.m]: Device returned error for command A5");
            [self.view makeToast:NSLocalizedString(@"Time and Date change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
        }
    }
    else if(self.sentCommand == A6 && [[response substringToIndex:2]isEqualToString:@"P6"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A6 answer");
        if([response isEqualToString:@"P61"])
        {
            [self.view makeToast:NSLocalizedString(@"Product price changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]];
        }
        else if([response isEqualToString:@"P62"])
        {
            NSLog(@"[MenuTableViewController.m]: Device returned error for command A6");
            [self.view makeToast:NSLocalizedString(@"Product price change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
        }
    }
    else if(self.sentCommand == A7 && [[response substringToIndex:2]isEqualToString:@"P7"])
    {
        NSLog(@"[MenuTableViewController.m]: Received A7 answer");
        if([response isEqualToString:@"P71"])
        {
            [self.view makeToast:NSLocalizedString(@"Product name changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]];
        }
        else if([response isEqualToString:@"P72"])
        {
            NSLog(@"[MenuTableViewController.m]: Device returned error for command A7");
            [self.view makeToast:NSLocalizedString(@"Product name change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
        }
    }
    else if(self.sentCommand == BATCH_COMMANDS)
    {
        if(self.batchCommands.count)
        {
            [self processBatchCommands];
        }
        else
        {
            self.sentCommand = NONE;
        }
        return;
    }
    else
    {
        NSLog(@"[MenuTableViewController]: Unknown response received. Data discarded.");
    }
    [self setSentCommand:NONE];
}

- (void) startTimeoutTimer
{
    self.timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10
                                     target:self
                                   selector:@selector(commandDidTimeout:)
                                   userInfo:nil
                                    repeats:NO];
}

- (void) commandDidTimeout:(NSTimer *) timer
{
    if(self.currentNavLevel == 255)
    {
        [self processMessage:nil didFinishEnteringItem:@"ERROR"];
    }
    else
    {
        [self setSentCommand:NONE];
        [self.view makeToast:NSLocalizedString(@"Device answer timeout occurred", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
    }
}


//BATCH COMMAND PROCESSING
- (void) processBatchCommands
{
    NSString *command = [self.batchCommands objectAtIndex:0];
    [self.batchCommands removeObjectAtIndex:0];
    [_protocol writeMessage:command];
    [self setSentCommand:BATCH_COMMANDS];
    [self startTimeoutTimer];
}

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (alertView.tag == BATCH_ALERT_TAG)
    {
        if (buttonIndex == 1)
        {
            [self processBatchCommands];
        }
    }
}

- (void) handleOpenURL:(NSURL *)url
{
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSString *contents = [[NSString alloc] initWithData: data encoding:NSUTF8StringEncoding];
    if(data == nil)
    {
        NSLog(@"[MenuTableViewController.m]: Error obtaining data from URL");
        [self.view makeToast:NSLocalizedString(@"Error obtaining data from URL", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
        return;
    }
    NSLog(@"[MenuTableViewController.m]: Read file contents from handled URL: %@",contents);
    NSError *error = nil;
    NSDictionary *JSONData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error: &error];
    if(!JSONData)
    {
        NSLog(@"[MenuTableViewController.m]: %@",error);
        [self.view makeToast:[error localizedDescription] duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]];
        return;
    }
    NSString *version = [JSONData objectForKey:@"version"];
    NSString *name = [JSONData objectForKey:@"name"];
    NSString *machineID = [JSONData objectForKey:@"machineID"];
    NSArray *commands = [JSONData objectForKey:@"commands"];
    NSString *errorString = nil;
    UIAlertView *alert;
    if(version == nil || commands == nil)
    {
        errorString = NSLocalizedString(@"Missing fields version and/or commands in JSON file",nil);
    }
    else if(![version isEqualToString:self.appDelegate.currentVersion])
    {
        errorString = NSLocalizedString(@"Version mismatch",nil);
    }
    else
    {
        self.batchCommands = [[NSMutableArray alloc] initWithArray:commands];
        if([name isEqualToString:@""])
        {
            name = @"file";
        }
        if(![machineID isEqualToString:self.machineMACAddr])
        {
            alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Confirmation",nil)
                                                            message:[NSString stringWithFormat:@"%@ \"%@\"?\n\n%@",NSLocalizedString(@"Do you want to run batch command file",nil),name,NSLocalizedString(@"WARNING: Machine ID does not match currently connected machine. Do you wish to continue?",nil)]
                                                           delegate:self
                                                  cancelButtonTitle:NSLocalizedString(@"Cancel",nil)
                                                  otherButtonTitles:NSLocalizedString(@"OK",nil), nil];
        }
        else
        {
            alert = [[UIAlertView alloc] initWithTitle: NSLocalizedString(@"Confirmation",nil)
                                               message: [NSString stringWithFormat:@"%@ \"%@\"?",NSLocalizedString(@"Do you want to run batch command file",nil),name]
                                                           delegate:self
                                                  cancelButtonTitle:NSLocalizedString(@"Cancel",nil)
                                                  otherButtonTitles:NSLocalizedString(@"OK",nil), nil];
        }
    }
    if(errorString != nil)
    {
        alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil)
                                           message:[NSString stringWithFormat:@"%@",errorString]
                                          delegate:nil
                                 cancelButtonTitle:NSLocalizedString(@"OK",nil)
                                 otherButtonTitles:nil];
    }
    alert.tag = BATCH_ALERT_TAG;
    [alert show];
}

//UITABLEVIEWCONTROLLER FUNCTIONS
- (void)viewDidLoad
{
    [super viewDidLoad];
    [_activityIndicator setHidden:YES];
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    
    //Set navigation bar
    UIImage *backImage = [UIImage imageNamed:@"back_arrow.png"];
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    backButton.frame = CGRectMake(0, 0, backImage.size.width/2, backImage.size.height/2);
    
    [backButton setImage:backImage forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(backButtonPressed:)    forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = backBarButtonItem;
    
    //Emmoco protocol initialization
    _protocol = [CommunicationProtocol sharedProtocol];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:kEMConnectionDidReceiveIndicatorNotificationName object:nil];
    [[EMConnectionManager sharedManager] addObserver:self forKeyPath:@"connectionState" options:0 context:NULL];
    self.protocol.delegate = self;
    
    //Initialize parentLayout stack
    [self setParentLayout:[[Stack alloc]init]];
    
    //Set navigation level
    [self initializeMenuEntries];
    [self setChildViewControllers:[[NSMutableArray alloc]init]];
    self.currentNavLevel = 255;
    
    //Initialize menu view
    [_protocol establishConnection];
    [self setSentCommand:HELLO];
    [self startTimeoutTimer];
    
    //Detect handled URL
    if(self.appDelegate.handledURL != nil)
    {
        NSLog(@"[MenuTableViewController.m]: Detected handled URL in appDelegate");
        [self handleOpenURL: self.appDelegate.handledURL];
    }
}

-(void)didReceiveNotification:(NSNotification*) notification
{

}

-(void)dealloc
{
    [[EMConnectionManager sharedManager] removeObserver:self forKeyPath:@"connectionState"];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    for(int i = 0; i < self.childViewControllers.count; i++)
    {
        ChildViewController *childController = [self.childViewControllers objectAtIndex:i];
        [childController parentViewControllerDidRotateWithOrientation: [[UIDevice currentDevice] orientation]];
    }
}

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    for(int i = 0; i < self.childViewControllers.count; i++)
    {
        ChildViewController *childController = [self.childViewControllers objectAtIndex:i];
        [childController parentViewControllerWillRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    }
}

- (void)removeChildFromParentController:(ChildViewController*)controller
{
    [self.childViewControllers removeObject:controller];
    NSLog(@"[MenuTableViewController]: %d childViewControllers left",self.childViewControllers.count);
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == [EMConnectionManager sharedManager])
    {
        if ([keyPath isEqualToString:@"connectionState"])
        {
            if ([[EMConnectionManager sharedManager] connectionState] == EMConnectionStateDisrupted)
            {
                UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2];
                UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Communication error",nil) message:NSLocalizedString(@"Connection lost",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
                [alert show];
                [[self navigationController] popToViewController:previous animated:YES];
            }
        }
    }
}

#pragma mark - Table view delegate

//CELL PROCESSING AND CUSTOMIZATION
- (void) addTags : (NSMutableArray*) rows : (NSInteger) tag
{
    for(int i = 0; i < [rows count]; i++)
    {
        NSMutableString *name = [NSMutableString stringWithString:[rows objectAtIndex:i]];
        [name insertString:[NSString stringWithFormat:@"[%d]",tag] atIndex:1];
        [rows replaceObjectAtIndex:i withObject:name];
    }
}

- (void) toggleDropList : (NSIndexPath*) index
{
    Boolean folded = FALSE;
    NSString *elementName = [[self currentElements] objectAtIndex:index.row];
    NSMutableString *newElementName = [[NSMutableString alloc] init];
    if([elementName characterAtIndex:0] == '>')
    {
        [newElementName setString:@"v"];
        [newElementName appendString:[elementName substringFromIndex:1]];
        folded = TRUE;
    }
    else
    {
        [newElementName setString:@">"];
        [newElementName appendString:[elementName substringFromIndex:1]];
    }
    [[self currentElements] replaceObjectAtIndex:index.row withObject:newElementName];
    NSMutableString *cellName = [NSMutableString stringWithString:[elementName substringFromIndex:1]];
    NSInteger lastPos = [cellName rangeOfString:@"]"].location;
    NSInteger cellTag = [[cellName substringWithRange:NSMakeRange(1,lastPos)] intValue];
    [cellName setString:[cellName substringFromIndex:lastPos+1]];
    
    //Cells in MENU
    if([self currentNavLevel] == MAINTENANCE)
    {
        if([cellName isEqualToString:@"Channels Present"] ||
           [cellName isEqualToString:@"Product Present in Channel"] ||
           [cellName isEqualToString:@"Channel Engine Status"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANNELS, nil];
            [newRows setArray:[newRows subarrayWithRange:NSMakeRange(0, [[self sensorStatus] numChannels])]];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
        else if([cellName isEqualToString:@"Money Collected"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_IN, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
        else if([cellName isEqualToString:@"Money Returned"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_OUT, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
        else if([cellName isEqualToString:@"Products Sold"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_PRODUCTS, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
        else if([cellName isEqualToString:@"Change Available"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANGE, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
    }
    else if([self currentNavLevel] == SALE)
    {
        if([cellName isEqualToString:@"Money Paid"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_PAID, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
        else if([cellName isEqualToString:@"Money Returned"])
        {
            NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_RETURNED, nil];
            if(folded)
            {
                [self addTags: newRows : cellTag];
                [self addRowsAtIndexPath: newRows : index];
            }
            else
            {
                [self removeRowsAtIndexPath: [newRows count] : index];
            }
        }
    }
    [self reloadTable:UITableViewRowAnimationNone];
}

- (void) addRowsAtIndexPath : (NSArray*) rows : (NSIndexPath*) indexPath
{
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, [rows count])];
    [[self currentElements] insertObjects:rows atIndexes:indexSet];
    [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] + [rows count])]];
}

- (void) removeRowsAtIndexPath : (NSUInteger) numRows : (NSIndexPath*) indexPath
{
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, numRows)];
    [[self currentElements] removeObjectsAtIndexes:indexSet];
    [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] - numRows)]];
}

//UITABLEVIEWCONTROLLER FUNCTIONS
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *title = @"";
    if([self currentHeaders] != nil)
    {
        title = [[self currentHeaders] objectAtIndex:section];
    }
    return title;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self currentStructure] objectAtIndex:section] intValue];
}

- (const NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    if(self.showIndexes)
    {
        return self.currentHeaders;
    }
    return nil;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    if(self.showIndexes)
    {
        return [self.currentHeaders indexOfObject:title];
    }
    return 0;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath];
    NSString *cellName = [[cell textLabel]text];
    uint8_t offset = 0;
    if([indexPath section])
    {
        for (int i = 0; i < [indexPath section]; i++)
        {
            offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue];
        }
    }
    //Cells in MENU
    if([self currentNavLevel] == MENU)
    {
        if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)])
        {
            if(self.sentCommand == NONE)
            {
                NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE");
                [[self protocol] readSensorData];
                [self setSentCommand:A4];
                [self startTimeoutTimer];
            }
        }
        else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)])
        {
            NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION");
            [self changeNavLevel:BASIC_CONFIGURATION:TRUE];
        }
    }
    //Cells in MAINTENANCE
    else if([self currentNavLevel] == MAINTENANCE)
    {
        if([cellName isEqualToString:NSLocalizedString(@"Channels Present", nil)] ||
                 [cellName isEqualToString:NSLocalizedString(@"Product Present in Channel", nil)] ||
                 [cellName isEqualToString:NSLocalizedString(@"Channel Engine Status", nil)] || 
                 [cellName isEqualToString:NSLocalizedString(@"Money Collected", nil)] ||
                 [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)] ||
                 [cellName isEqualToString:NSLocalizedString(@"Products Sold", nil)] ||
                 [cellName isEqualToString:NSLocalizedString(@"Change Available", nil)])
        {
            [self toggleDropList:indexPath];
        }
        else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)])
        {
            if(self.sentCommand == NONE)
            {
                [self setRequestedLog:SALES_LOG];
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad_Landscape" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
                else
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_Landscape" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
            }
        }
        else if([cellName isEqualToString:NSLocalizedString(@"Incident log", nil)])
        {
            if(self.sentCommand == NONE)
            {
                [self setRequestedLog:INCIDENT_LOG];
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad_Landscape" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
                else
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_Landscape" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController" bundle:nil];
                        self.dateRangePickerViewController.delegate = self;
                        self.dateRangePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count];
                        [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
            }
        }
        else if([cellName isEqualToString:NSLocalizedString(@"Send report", nil)])
        {
            NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
            NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
            NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];
            NSString *date = [NSString stringWithFormat:@"%02d/%02d/%d %02d:%02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components second]];
            [self sendMaintenanceReport: [[self sensorStatus] response] : date: [self machineMACAddr]];
        }
    }
    //Cells in BASIC_CONFIGURATION
    else if([self currentNavLevel] == BASIC_CONFIGURATION)
    {
        //Update Date & Time command
        if([cellName isEqualToString:NSLocalizedString(@"Update Date & Time", nil)])
        {
            if(self.sentCommand == NONE)
            {
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad_Landscape" bundle:nil];
                        self.datePickerViewController.delegate = self;
                        self.datePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count];
                        [self.datePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad" bundle:nil];
                        self.datePickerViewController.delegate = self;
                        self.datePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count];
                        [self.datePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
                else
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_Landscape" bundle:nil];
                        self.datePickerViewController.delegate = self;
                        self.datePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count];
                        [self.datePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController" bundle:nil];
                        self.datePickerViewController.delegate = self;
                        self.datePickerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count];
                        [self.datePickerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
            }
        }
        //Update Product Price command
        else if([cellName isEqualToString:NSLocalizedString(@"Update product price", nil)])
        {
            if(self.sentCommand == NONE)
            {
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad_Landscape" bundle:nil];
                        self.priceChangerViewController.delegate = self;
                        self.priceChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count];
                        [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad" bundle:nil];
                        self.priceChangerViewController.delegate = self;
                        self.priceChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count];
                        [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
                else
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_Landscape" bundle:nil];
                        self.priceChangerViewController.delegate = self;
                        self.priceChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count];
                        [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController" bundle:nil];
                        self.priceChangerViewController.delegate = self;
                        self.priceChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count];
                        [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
            }
        }
        //Update Product Name command
        else if([cellName isEqualToString:NSLocalizedString(@"Update product name", nil)])
        {
            if(self.sentCommand == NONE)
            {
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad_Landscape" bundle:nil];
                        self.nameChangerViewController.delegate = self;
                        self.nameChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count];
                        [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad" bundle:nil];
                        self.nameChangerViewController.delegate = self;
                        self.nameChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count];
                        [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
                else
                {
                    if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
                    {
                        self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_Landscape" bundle:nil];
                        self.nameChangerViewController.delegate = self;
                        self.nameChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count];
                        [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                    else
                    {
                        self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController" bundle:nil];
                        self.nameChangerViewController.delegate = self;
                        self.nameChangerViewController.childDelegate = self;
                        [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count];
                        [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
                    }
                }
            }
        }
    }
    else if([self currentNavLevel] == SALE_LIST)
    {
        if([self generateSaleNavLevel: [indexPath row] + offset])
        {
            [self changeNavLevel:SALE:TRUE];
        }
    }
    else if([self currentNavLevel] == SALE)
    {
        if([cellName isEqualToString:NSLocalizedString(@"Money Paid", nil)] ||
           [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)])
        {
            [self toggleDropList:indexPath];
        }

    }
    else if([self currentNavLevel] == INCIDENT_LIST)
    {
        if([self generateIncidentNavLevel: [indexPath row] + offset])
        {
            [self changeNavLevel:INCIDENT:TRUE];
        }
    }
}

#pragma mark - Table view data source

-(NSInteger)tableView: (UITableView *)tableView indentationLevelForRowAtIndexPath: (NSIndexPath *)indexPath
{
    NSInteger indent = 0;
    if([[[self currentElements] objectAtIndex:indexPath.row] characterAtIndex:0] == '*')
    {
        indent++;
    }
    return indent;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self currentStructure] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Boolean needsIndent = FALSE;
    Boolean foldedList = FALSE;
    Boolean unfoldedList = FALSE;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self currentCellIdentifier] forIndexPath:indexPath];
    //INSTANTIATE CELL IF NEEDED
    if (cell == nil)
    {
        if([self currentNavLevel] == MAINTENANCE)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[self currentCellIdentifier]];
        }
        else
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self currentCellIdentifier]];
        }
    }
    //CALCULATE TRUE ROW TO RETRIEVE NAME
    uint8_t offset = 0;
    if([indexPath section] )
    {
        for (int i = 0; i < [indexPath section]; i++)
        {
            offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue];
        }
    }
    //RETRIEVE NAME
    NSMutableString *cellText = [NSMutableString stringWithString:[[self currentElements] objectAtIndex:[indexPath row]+offset]];
    //SET INDENT
    [cell setIndentationWidth:10];
    //PARSE AND REMOVE CELL MODIFIER
    if([cellText characterAtIndex:0] == '>')
    {
        foldedList = TRUE;
        [cellText setString:[cellText substringFromIndex:1]];
    }
    else if([cellText characterAtIndex:0] == 'v')
    {
        unfoldedList = TRUE;
        [cellText setString:[cellText substringFromIndex:1]];
    }
    else if([cellText characterAtIndex:0] == '*')
    {
        needsIndent = TRUE;
        [cellText setString:[cellText substringFromIndex:1]];
    }
    //PARSE AND REMOVE TAG
    NSInteger lastPos = [cellText rangeOfString:@"]"].location;
    NSInteger cellTag = [[cellText substringWithRange:NSMakeRange(1,lastPos-1)] intValue];
    [cell setTag:cellTag];
    [cellText setString:[cellText substringFromIndex:lastPos+1]];
    //SET FINAL TEXT
    [[cell textLabel] setText:NSLocalizedString(cellText,nil)];
    
    //MAINTENANCE CELLS
    if([self currentNavLevel] == MAINTENANCE)
    {
        [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview];
        [[cell detailTextLabel] setText:@""];
        [cell setAccessoryView:nil];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
        if(foldedList)
        {
            NSInteger cellHeight = cell.contentView.frame.size.height;
            UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
            imageView.image = [UIImage imageNamed:@"carat.png"];
            imageView.tag = CELL_CARAT_TAG;
            [cell.contentView addSubview:imageView];
        }
        else if(unfoldedList)
        {
            NSInteger cellHeight = cell.contentView.frame.size.height;
            UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
            imageView.image = [UIImage imageNamed:@"carat-open.png"];
            imageView.tag = CELL_CARAT_TAG;
            [cell.contentView addSubview:imageView];
        }
        if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channels Present",nil)])
        {
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",[[self sensorStatus] numChannels]]];
            [cell setAccessoryView:nil];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Present in Channel",nil)])
        {
            [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            for(int i = 0; i < [[self sensorStatus] numChannels]; i++)
            {
                if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:i] intValue] != 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                    break;
                }
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel Engine Status",nil)])
        {
            [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            for(int i = 0; i < [[self sensorStatus] numChannels]; i++)
            {
                if([[[[self sensorStatus] channelStatus] objectAtIndex:i] intValue] != 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                    break;
                }
            }
        }
        else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Channel",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0)
        {
            NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Channel",nil) length] + 1)] intValue] - 1;
            if([cell tag] == 2001) // Products Present in Channel tag
            {
                if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:index] intValue] == 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
                }
                else
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                }
            }
            else if([cell tag] == 2002) // Channel engine status tag
            {
                if([[[[self sensorStatus] channelStatus] objectAtIndex:index] intValue] == 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
                }
                else
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                }
            }

        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Door Sensor",nil)])
        {
            if([[self sensorStatus] doorOpen])
            {
                [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)];
                [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
            }
            else
            {
                [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)];
                [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Coil Sensor",nil)])
        {
            if([[self sensorStatus] coilOpen])
            {
                [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)];
                [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
            }
            else
            {
                [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)];
                [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Collected",nil)])
        {
            double numCollected = 0;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:0] intValue] * 20;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:1] intValue] * 10;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:2] intValue] * 5;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:3] intValue] * 2;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:4] intValue] * 1;
            numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:5] intValue] * 0.50;
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)])
        {
            double numReturned = 0;
            numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:0] intValue] * 2;
            numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:1] intValue] * 1;
            numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:2] intValue] * 0.50;
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Products Sold",nil)])
        {
            NSInteger numSold = 0;
            for(int i = 0; i < MAX_PRODUCTS; i++)
            {
                numSold += [[[[self sensorStatus] productsSold] objectAtIndex:i] intValue];
            }
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",numSold]];
        }
        else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Product",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0)
        {
            NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Product",nil) length] + 1)] intValue] - 1;
            if([cell tag] == 2007)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] productsSold] objectAtIndex:index] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Change Available",nil)])
        {
            [[cell detailTextLabel] setText:@""];
            [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            for(int i = 0; i < CHANGE_NUM_UNITS; i++)
            {
                if([[[[self sensorStatus] changeAvailable] objectAtIndex:i] intValue] != 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                    break;
                }
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:0] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:1] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:2] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:3] stringValue]];
            }
            else if([cell tag] == 2006)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:0] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:4] stringValue]];
            }
            else if([cell tag] == 2006)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:1] stringValue]];
            }
            else if([cell tag] == 2008)
            {
                if([[[[self sensorStatus] changeAvailable] objectAtIndex:0] intValue] == 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
                }
                else
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                }
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)])
        {
            if([cell tag] == 2005)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:5] stringValue]];
            }
            else if([cell tag] == 2006)
            {
                [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:2] stringValue]];
            }
            else if([cell tag] == 2008)
            {
                if([[[[self sensorStatus] changeAvailable] objectAtIndex:1] intValue] == 1)
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
                }
                else
                {
                    [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
                }
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Sales log",nil)] ||
                [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Incident report",nil)]  ||
                [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Send report",nil)])
        {
            [[cell detailTextLabel] setText:@""];
            [cell setAccessoryView:nil];
            [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        }
    }
    else if([self currentNavLevel] == SALE)
    {
        [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview];
        [[cell detailTextLabel] setText:@""];
        [cell setAccessoryView:nil];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
        if(foldedList)
        {
            NSInteger cellHeight = cell.contentView.frame.size.height;
            UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
            imageView.image = [UIImage imageNamed:@"carat.png"];
            imageView.tag = CELL_CARAT_TAG;
            [cell.contentView addSubview:imageView];
        }
        else if(unfoldedList)
        {
            NSInteger cellHeight = cell.contentView.frame.size.height;
            UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
            imageView.image = [UIImage imageNamed:@"carat-open.png"];
            imageView.tag = CELL_CARAT_TAG;
            [cell.contentView addSubview:imageView];
        }
        if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Paid",nil)])
        {
            double numCollected = 0;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:0] intValue] * 20;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:1] intValue] * 10;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:2] intValue] * 5;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:3] intValue] * 2;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:4] intValue] * 1;
            numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:5] intValue] * 0.50;
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]];
            [cell setAccessoryView:nil];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel",nil)])
        {
            [[cell detailTextLabel] setText:[[self currentSale] channel]];
            [cell setAccessoryView:nil];
        }
        if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Code",nil)])
        {
            [[cell detailTextLabel] setText:[[self currentSale] productCode]];
            [cell setAccessoryView:nil];
        }
        if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Price",nil)])
        {
            [[cell detailTextLabel] setText:[[self currentSale] normalPrice]];
            [cell setAccessoryView:nil];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)])
        {
            double numReturned = 0;
            numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:0] intValue] * 2;
            numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:1] intValue] * 1;
            numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:2] intValue] * 0.50;
            [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]];
            [cell setAccessoryView:nil];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:0] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:1] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:2] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:3] stringValue]];
            }
            else if([cell tag] == 3004)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:0] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:4] stringValue]];
            }
            else if([cell tag] == 3004)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:1] stringValue]];
            }
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)])
        {
            if([cell tag] == 3000)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid]objectAtIndex:5] stringValue]];
            }
            else if([cell tag] == 3004)
            {
                [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:2] stringValue]];
            }
        }
    }
    else if([self currentNavLevel] == INCIDENT)
    {
        [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview];
        [[cell detailTextLabel] setText:@""];
        [cell setAccessoryView:nil];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
        if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Error Code",nil)])
        {
            [[cell detailTextLabel] setText:[self.currentIncident errorCode]];
            [cell setAccessoryView:nil];
        }
        else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Error Value",nil)])
        {
            [[cell detailTextLabel] setText:[self.currentIncident errorValue]];
            [cell setAccessoryView:nil];
        }
    }
    return cell;
}

//DELEGATE FUNCTIONS
- (void)passDateViewController:(DatePickerViewController *)controller didFinishEnteringItem:(NSDate *)date
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *components = [calendar components:units fromDate:date];
    [_protocol updateTime: components];
    [self setSentCommand:A5];
    [self startTimeoutTimer];
}

- (void)passPriceViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data
{
    //Channel,Code,Price
    NSString *channelString = [data objectAtIndex:0];
    NSString *codeString = [data objectAtIndex:1];
    NSString *priceString = [data objectAtIndex:2];
    if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^\\d+(\\.\\d+)?$"] options:0 error:NULL] numberOfMatchesInString:priceString options:0 range:NSMakeRange(0,[priceString length])])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered price has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if([channelString length] == 0)
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing channel",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if([codeString length] == 0)
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing product code",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:channelString options:0 range:NSMakeRange(0,[channelString length])])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered channel has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:codeString options:0 range:NSMakeRange(0,[codeString length])])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered product code has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else
    {
        int channel = [channelString intValue];
        int code = [codeString intValue];
        NSArray *price = [priceString componentsSeparatedByString:@"."];
        [_protocol updatePrice:channel :code :[[price objectAtIndex:0] intValue] :[[price objectAtIndex:1] intValue]];
        [self setSentCommand:A6];
        [self startTimeoutTimer];
    }
}

- (void)passNameViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data
{
    //Channel,Code,Name
    NSString *channelString = [data objectAtIndex:0];
    NSString *codeString = [data objectAtIndex:1];
    NSString *name = [data objectAtIndex:2];
    if([channelString length] == 0)
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing channel",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if([codeString length] == 0)
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing product code",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:channelString options:0 range:NSMakeRange(0,[channelString length])])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered channel has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:codeString options:0 range:NSMakeRange(0,[codeString length])])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered product code has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil];
        [alert show];
    }
    else
    {
        int channel = [channelString intValue];
        int code = [codeString intValue];
        [_protocol updateProductName:channel :code :name];
        [self setSentCommand:A7];
        [self startTimeoutTimer];
    }
}

- (void) passDateRangeViewController:(DateRangePickerViewController*)controller didFinishEnteringItem:(NSDate*) from : (NSDate*) to
{
    [NSThread sleepForTimeInterval:1]; //HACK!
    if([self requestedLog] == SALES_LOG)
    {
        NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALE_LIST");
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
        NSDateComponents *componentsFrom = nil;
        NSDateComponents *componentsTo = nil;
        if(from != nil)
        {
            componentsFrom = [calendar components:units fromDate:from];
        }
        if(to != nil)
        {
            componentsTo = [calendar components:units fromDate:to];
        }
        [_protocol readSalesLog: componentsFrom : componentsTo];
        [self setSentCommand:A2];
        [self startTimeoutTimer];
    }
    else if([self requestedLog] == INCIDENT_LOG)
    {
        NSLog(@"[MenuTableViewController.m]: Changing to navLevel: INCIDENT_LIST");
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
        NSDateComponents *componentsFrom = nil;
        NSDateComponents *componentsTo = nil;
        if(from != nil)
        {
            componentsFrom = [calendar components:units fromDate:from];
        }
        if(to != nil)
        {
            componentsTo = [calendar components:units fromDate:to];
        }
        [_protocol readIncidentLog: componentsFrom : componentsTo];
        [self setSentCommand:A3];
        [self startTimeoutTimer];
    }
}

@end
