/*
  Copyright (C) 2000-2005 SKYRIX Software AG

  This file is part of SOPE.

  SOPE is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version.

  SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with SOPE; see the file COPYING.  If not, write to the
  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  02111-1307, USA.
*/

#include "WOHyperlinkInfo.h"
#include "WOElement+private.h"
#include "WOHTMLDynamicElement.h"
#include "common.h"

@implementation WOHyperlinkInfo

- (id)initWithConfig:(NSMutableDictionary *)_config {
  unsigned count;

  if ((self->initialCount = count = [_config count]) == 0) {
    NSLog(@"%s: missing associations for WOHyperlink !", __PRETTY_FUNCTION__);
    RELEASE(self);
    return nil;
  }
  
  self->sidInUrl = YES;
  
  //NSLog(@"CONFIG: %@", _config);
  
  if ((self->action = OWGetProperty(_config, @"action"))) {
    count--;
#if DEBUG
    if (count > 0) {
      if ([_config objectForKey:@"pageName"] ||
          [_config objectForKey:@"href"]     ||
          [_config objectForKey:@"directActionName"] ||
          [_config objectForKey:@"actionClass"]) {
        NSLog(@"WARNING: inconsistent association settings in WOHyperlink !"
              @" (assign only one of pageName, href, "
              @"directActionName or action)");
      }
    }
#endif
    if ([self->action isValueConstant]) {
      /* make a direct-action ... */
      self->directActionName = self->action;
      self->action = nil;

      if (count > 0) {
        if ((self->actionClass = OWGetProperty(_config,@"actionClass")))
          count--;
      }
      if (count > 0) {
        WOAssociation *sidInUrlAssoc;
        
        if ((sidInUrlAssoc = OWGetProperty(_config, @"?wosid"))) {
          self->sidInUrl = [sidInUrlAssoc boolValueInComponent:nil];
          RELEASE(sidInUrlAssoc);
          count--;
        }
        else
          self->sidInUrl = YES;
      }
      else
        self->sidInUrl = YES;
    }
  }
  else if ((self->pageName = OWGetProperty(_config, @"pageName"))) {
    count--;
#if DEBUG
    if (count > 0) {
      if ([_config objectForKey:@"action"] ||
          [_config objectForKey:@"href"]     ||
          [_config objectForKey:@"directActionName"] ||
          [_config objectForKey:@"actionClass"]) {
        NSLog(@"WARNING: inconsistent association settings in WOHyperlink !"
              @" (assign only one of pageName, href, "
              @"directActionName or action)");
      }
    }
#endif
  }
  else if ((self->href = OWGetProperty(_config, @"href"))) {
    count--;
    if (count > 0) {
      WOAssociation *sidInUrlAssoc;
      
      if ((sidInUrlAssoc = OWGetProperty(_config, @"?wosid"))) {
        self->sidInUrl = [sidInUrlAssoc boolValueInComponent:nil];
        RELEASE(sidInUrlAssoc);
        count--;
      }
      else
        self->sidInUrl = NO;
    }
#if DEBUG
    if (count > 0) {
      if ([_config objectForKey:@"action"] ||
          [_config objectForKey:@"pageName"]     ||
          [_config objectForKey:@"directActionName"] ||
          [_config objectForKey:@"actionClass"]) {
        NSLog(@"WARNING: inconsistent association settings in WOHyperlink !"
              @" (assign only one of pageName, href, "
              @"directActionName or action)");
      }
    }
#endif
  }
  else if ((self->directActionName = OWGetProperty(_config,@"directActionName"))) {
    count--;
    if (count > 0) {
      if ((self->actionClass = OWGetProperty(_config,@"actionClass")))
        count--;
    }
    if (count > 0) {
      WOAssociation *sidInUrlAssoc;
      
      if ((sidInUrlAssoc = OWGetProperty(_config, @"?wosid"))) {
        self->sidInUrl = [sidInUrlAssoc boolValueInComponent:nil];
        RELEASE(sidInUrlAssoc);
        count--;
      }
      else
        self->sidInUrl = YES;
    }
    
#if DEBUG
    if (count > 0) {
      if ([_config objectForKey:@"action"] ||
          [_config objectForKey:@"href"]     ||
          [_config objectForKey:@"pageName"]) {
        NSLog(@"WARNING: inconsistent association settings in WOHyperlink !"
              @" (assign only one of pageName, href, "
              @"directActionName or action)");
      }
    }
#endif
  }
  else {
    NSLog(@"%s: missing link-type specified for WOHyperlink (config=%@) !",
          __PRETTY_FUNCTION__, _config);
    RELEASE(self);
    return nil;
  }
  
  if (count > 0) {
    if ((self->string = OWGetProperty(_config, @"string"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->fragmentIdentifier=OWGetProperty(_config, @"fragmentIdentifier"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->target = OWGetProperty(_config, @"target"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->queryDictionary = OWGetProperty(_config, @"queryDictionary"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->queryParameters = OWExtractQueryParameters(_config))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->disabled = OWGetProperty(_config, @"disabled"))) {
      count--;
      assocCount++;
    }
  }

  if (count > 0) {
    if ((self->filename = OWGetProperty(_config, @"filename"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->framework = OWGetProperty(_config, @"framework"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->src = OWGetProperty(_config, @"src"))) {
      count--;
      assocCount++;
    }
  }
  if (count > 0) {
    if ((self->disabledFilename = OWGetProperty(_config, @"disabledFilename"))) {
      count--;
      assocCount++;
    }
  }
  
  self->rest = _config;
  
  return self;
}

@end /* WOHyperlinkInfo */
