<?php
//  $Id$

/**
 *  @file   guidebook.module
 *  @desc   a guidbooke for buildering/climbing related activities!
 */

require_once('guidebook-display.inc');

/**
 *    implementation of hook_perm()
 */

function guidebook_perm()    {
    
$perms    =    array('create guidebook''edit own guidebook''edit any guidebook''delete own guidebook',
        
'delete any guidebook''create route''edit own route''edit any route''delete own route''delete any route'
    
);
    return 
$perms;
}

/**
 *    implementation of hook_access()
 */

function guidebook_access($op$node$account)    {
    
$is_author    =    $account->uid == $node->uid;
    
$node        =    $node->type;
    switch (
$op)    {
        case 
'create':
            return 
user_access("create {$node}"$account);
            break;
        case 
'update':
            return 
user_access("edit own {$node}"$account) and $is_author or user_access("edit any {$node}"$account);
            break;
        case 
'delete':
            return 
user_access("delete own {$node}"$account) and $is_author or user_access("delete any {$node}"$account);
            break;
    }
}

/**
 *  implementation of hook_node_info()
 *  define two nodes (guidebook/route)
 */

function guidebook_node_info()  {
    
$nodes  =   array(
        
'guidebook' =>  array(
            
'name'          =>  t('Guidebook'),
            
'module'        =>  'guidebook',
            
'description'   =>  t('A climbing/buildering guidebook'),
        ),
        
'route' =>  array(
            
'name'          =>  t('Route'),
            
'module'        =>  'guidebook',
            
'description'   =>  t('A climbing/buildering route'),
        ),
    );
    return 
$nodes;
}

/**
 *    implementation of hook_nodeapi()
 *    we are using this for hook_validate(), hook_insert() and hook_update() due to not being
 *    able to update node information with $file->fid after we validate our file uploads
 */

function guidebook_nodeapi(&$node$op)    {
        if (!
in_array($node->type, array('guidebook''route') ) )  {
            return 
0;
        }

    static 
$fid;
    
    switch (
$op)    {
        case 
"validate":
            
$files    =    file_directory_path().'/guidebook';
            
file_check_directory($filesFILE_CREATE_DIRECTORY);
        
            
$function    =    '_'.$node->type.'_validate';
            
$fid        =    $function($node);
            break;

        case 
"insert":
            
$function    =    '_'.$node->type.'_insert';
            return 
$function($node$fid);
            break;
        
        case 
"update":
        
//    for purpose of updating, only update fid if it's a new image
            
$fid $fid $fid $node->fid;

        
//    remove existing file if there's an update to it
            
if ($fid != $node->fid OR $node->remove_image == 1)    {
                
$query    =    "SELECT filepath FROM {files} WHERE fid = %d";
                
$result    =    db_fetch_object(db_query($query$node->fid) );
                
file_delete($result->filepath);
                
file_delete(_get_image_thumbnail($result->filepath) );
                
                
$query    =    "DELETE FROM {files} WHERE fid = %d";
                
db_query($query$node->fid);
            }
        
//    remove $node->fid if we need to
            
if ($node->remove_image == 1)    {
                
$fid 0;
            }
            
            
$function    =    '_'.$node->type.'_update';
            return 
$function($node$fid);
            break;
            
        case 
"delete revision":
            
db_query("DELETE FROM {%s} WHERE vid = %d"$node->type$node->vid);
            break;
    }
}

/**
 *    implementation of hook_load()
 */

function guidebook_load(&$node)    {
    
$function    =    '_'.$node->type.'_load';
    return 
$function($node);
}

/**
 *    implementation of hook_delete()
 */
function guidebook_delete(&$node)    {
    
$query    =    "SELECT filepath FROM {files} WHERE fid = %d";
    
$result    =    db_fetch_object(db_query($query$node->fid) );
    
file_delete($result->filepath);
    
file_delete(_get_image_thumbnail($result->filepath) );

    
$query    =    "DELETE FROM {%s} WHERE nid = %d";
    
db_query($query$node->type$node->nid);

    
$query "DELETE FROM {files} WHERE fid = %d";
    
db_query($query$node->fid);
}

/**
 *    implementation of guidebook_load()
 */

function _guidebook_load(&$node)    {
    
$query    =    "SELECT fid FROM {guidebook} WHERE vid = '%d'";
    return 
db_fetch_object(db_query($query$node->vid) );
}

/**
 * implementation of route_load()
 */

function _route_load(&$node)    {
    
$query    =    "SELECT fid, gid, difficulty, quality, latitude, longitude, descent
                FROM {route} WHERE vid = '%d'"
;
    return 
db_fetch_object(db_query($query$node->vid) );
}

/**
 *    implementation of guidebook_update()
 *    @param    object    node
 *    @param    int        fid
 */

function _guidebook_update(&$node$fid)    {
    if (
$node->revision)    {
        return 
_guidebook_insert(&$node$fid);
    } else {
        
$query    =    "UPDATE {guidebook} SET fid = %d WHERE vid = %d";
        
db_query($query$fid$node->vid);
    }
}

/**
 *    implementation of route_update()
 *    @param    object    node
 *    @param    int        fid
 */

function _route_update(&$node$fid)    {
    if (
$node->revision)    {
        return 
_route_insert(&$node$fid);
    } else {
        
$query    =    "UPDATE {route} SET
                        fid = %d,
                        gid = %d,
                        latitude = %f,
                        longitude = %f,
                        difficulty = %d,
                        quality = %d,
                        descent = '%s'
                    WHERE
                        vid = %d"
;
        
db_query($query$fid$node->gid$node->latitude$node->longitude$node->difficulty$node->quality$node->descent$node->vid);
    }
}

/**
 *    implementation of guidebook_validate()
 *    @param    object    node
 *    @return    int        fid
 */

function _guidebook_validate(&$node)    {
    
$validators =   array(
        
'file_validate_is_image'    =>  array(),
    );
    if (
$file file_save_upload('image'$validatorsfile_directory_path().'/guidebook') )    {
        
file_set_status($file1);
    }
    
$fid    =    isset($file->fid) ? $file->fid 0
    return 
$fid;
}

/**
 *    implementation of route_validate()
 *    @param    object    node
 *    @return    int        fid
 */

function _route_validate(&$node)    {
    
$fid    =    0;
    
$long    =    (float) number_format($node->longitude6);
    
$lat    =    (float) number_format($node->latitude6);

    if (!
is_float($long) or !($long >= -180) or !($long <= 180) )    {
        
form_set_error('longitude't('The longitude provided is invalid') );
    }
    if (!
is_float($lat) or !($lat >= -180) or !($lat <= 180) )    {
        
form_set_error('latitude't('The latitude provided is invalid') );
    }
    if (!
$node->gid)    {
        
form_set_error('gid't('You must choose a guidebook for this route') );
    }
    
    
$validators =   array(
        
'file_validate_is_image'    =>  array(),
    );
    if (
$file file_save_upload('image'$validatorsfile_directory_path().'/guidebook') )    {
        
file_set_status($file1);
        
$fid    =    $file->fid;
    }
    return 
$fid;
}

/**
 *  implementation of guidebook_insert()
 *    @param    object    node
 *    @param    int        fid
 */

function _guidebook_insert(&$node$fid)  {
    
$query  =   "INSERT INTO {guidebook} (nid, vid, fid) VALUES (%d, %d, %d)";
    
db_query($query$node->nid$node->vid$fid);
}

/**
 * implementation of route_insert()
 *    @param    object    node
 *    @param    int        fid
 */

function _route_insert(&$node$fid)  {
    
$query  =   "INSERT INTO {route} (nid, vid, fid, gid, latitude, longitude, difficulty, quality, descent)
                VALUES (%d, %d, %d, %d, %f, %f, %d, %d, '%s')"
;
    
db_query($query$node->nid$node->vid$fid$node->gid$node->latitude$node->longitude$node->difficulty$node->quality$node->descent);
}

//    ----------    End of hooks for guidebook.module, just utility functions down here ----------    //

/**
 *    utility function to get width/height values
 *    @param    string    width x height representation
 *    @return    array     width and height array
 *    @private
 */

function _get_image_size($size null)    {
    if (!
$size)    {
        
$size    =    variable_get('guidebook_thumbnail_size''200x200');
    }
    
$size    =    explode('x'$size);
    
$width    =    trim( (int) $size[0]);
    
$height    =    trim( (int) $size[1]);
    return array(
'width' => $width'height' => $height);
}

/**
 *    utility function to get a path to an image by fid (suitable for use in an img src attribute)
 *    @param    int        fid
 *    @return    string    path to image
 *    @private
 */

function _get_image_path($fid)    {
    global 
$base_path;
    
$query    =    "SELECT filepath FROM {files} WHERE fid = %d";
    
$result    =    db_fetch_object(db_query($query$fid) );
    return 
$base_path.$result->filepath;
}

/**
 *    utility function to generate a thumbnail path
 *    @param    string    path to image
 *    @param    boolean    trigger to determine whether to create the thumbnail or not
 *    @return    string    path to thumbnail
 *    @private
 */

function _get_image_thumbnail($path$create false)    {
    
$ext    =    substr($path, -4);
    
$thumb    =    substr($path0, -4).'-thumbnail'.$ext;
    if (
$create)    {
        
_create_image_thumbnail($path);
    }
    return 
$thumb;
}

/**
 *    utility function to create a thumbnail
 *    @param    string    path to image
 *    @return    null
 *    @private
 */

function _create_image_thumbnail($path)    {
    
$orig    =    file_directory_path().'/guidebook/'.basename($path);
    
$thumb    =    _get_image_thumbnail($orig);
    if (!
is_file($thumb) )    {
        
$size    =    _get_image_size();
        
image_scale($orig$thumb$size['width'], $size['height']);
    }
}

/**
 *    provide an image lookup for quality/difficulty values
 *    @param    string    quality | difficulty
 *    @param    int        id
 *    @return string    path to image, suitable for attribute of img tag
 *    @private
 */

function _lookup($param$id)    {
    global 
$base_path;
    
$quality            =    array(=> 'quality-low.jpg'=> 'quality-mid.jpg'=> 'quality-high.jpg');
    
$difficulty            =    array(=> 'difficulty-low.jpg'2=> 'difficulty-mid.jpg'=> 'difficulty-high.jpg'=> 'difficulty-expert.jpg');
    
$lookup                =    $$param;
    
$path                =    $base_path.drupal_get_path('module''guidebook').'/'.$lookup[$id];
    return 
$path;
}