View Source

/hsphere/local/home/c251266/sunsetvines.com/www.sunsetvines.com/sunsetvines/current/vendor/creovel/helpers/form.php (22.916 KB)

#0001  
#0002  
#0003  
#0004  
#0005  
#0006  
#0007  
#0008  
#0009  
#0010  
#0011  
#0012  
#0013  
#0014  
#0015  
#0016  
#0017  
#0018  
#0019  
#0020  
#0021  
#0022  
#0023  
#0024  
#0025  
#0026  
#0027  
#0028  
#0029  
#0030  
#0031  
#0032  
#0033  
#0034  
#0035  
#0036  
#0037  
#0038  
#0039  
#0040  
#0041  
#0042  
#0043  
#0044  
#0045  
#0046  
#0047  
#0048  
#0049  
#0050  
#0051  
#0052  
#0053  
#0054  
#0055  
#0056  
#0057  
#0058  
#0059  
#0060  
#0061  
#0062  
#0063  
#0064  
#0065  
#0066  
#0067  
#0068  
#0069  
#0070  
#0071  
#0072  
#0073  
#0074  
#0075  
#0076  
#0077  
#0078  
#0079  
#0080  
#0081  
#0082  
#0083  
#0084  
#0085  
#0086  
#0087  
#0088  
#0089  
#0090  
#0091  
#0092  
#0093  
#0094  
#0095  
#0096  
#0097  
#0098  
#0099  
#0100  
#0101  
#0102  
#0103  
#0104  
#0105  
#0106  
#0107  
#0108  
#0109  
#0110  
#0111  
#0112  
#0113  
#0114  
#0115  
#0116  
#0117  
#0118  
#0119  
#0120  
#0121  
#0122  
#0123  
#0124  
#0125  
#0126  
#0127  
#0128  
#0129  
#0130  
#0131  
#0132  
#0133  
#0134  
#0135  
#0136  
#0137  
#0138  
#0139  
#0140  
#0141  
#0142  
#0143  
#0144  
#0145  
#0146  
#0147  
#0148  
#0149  
#0150  
#0151  
#0152  
#0153  
#0154  
#0155  
#0156  
#0157  
#0158  
#0159  
#0160  
#0161  
#0162  
#0163  
#0164  
#0165  
#0166  
#0167  
#0168  
#0169  
#0170  
#0171  
#0172  
#0173  
#0174  
#0175  
#0176  
#0177  
#0178  
#0179  
#0180  
#0181  
#0182  
#0183  
#0184  
#0185  
#0186  
#0187  
#0188  
#0189  
#0190  
#0191  
#0192  
#0193  
#0194  
#0195  
#0196  
#0197  
#0198  
#0199  
#0200  
#0201  
#0202  
#0203  
#0204  
#0205  
#0206  
#0207  
#0208  
#0209  
#0210  
#0211  
#0212  
#0213  
#0214  
#0215  
#0216  
#0217  
#0218  
#0219  
#0220  
#0221  
#0222  
#0223  
#0224  
#0225  
#0226  
#0227  
#0228  
#0229  
#0230  
#0231  
#0232  
#0233  
#0234  
#0235  
#0236  
#0237  
#0238  
#0239  
#0240  
#0241  
#0242  
#0243  
#0244  
#0245  
#0246  
#0247  
#0248  
#0249  
#0250  
#0251  
#0252  
#0253  
#0254  
#0255  
#0256  
#0257  
#0258  
#0259  
#0260  
#0261  
#0262  
#0263  
#0264  
#0265  
#0266  
#0267  
#0268  
#0269  
#0270  
#0271  
#0272  
#0273  
#0274  
#0275  
#0276  
#0277  
#0278  
#0279  
#0280  
#0281  
#0282  
#0283  
#0284  
#0285  
#0286  
#0287  
#0288  
#0289  
#0290  
#0291  
#0292  
#0293  
#0294  
#0295  
#0296  
#0297  
#0298  
#0299  
#0300  
#0301  
#0302  
#0303  
#0304  
#0305  
#0306  
#0307  
#0308  
#0309  
#0310  
#0311  
#0312  
#0313  
#0314  
#0315  
#0316  
#0317  
#0318  
#0319  
#0320  
#0321  
#0322  
#0323  
#0324  
#0325  
#0326  
#0327  
#0328  
#0329  
#0330  
#0331  
#0332  
#0333  
#0334  
#0335  
#0336  
#0337  
#0338  
#0339  
#0340  
#0341  
#0342  
#0343  
#0344  
#0345  
#0346  
#0347  
#0348  
#0349  
#0350  
#0351  
#0352  
#0353  
#0354  
#0355  
#0356  
#0357  
#0358  
#0359  
#0360  
#0361  
#0362  
#0363  
#0364  
#0365  
#0366  
#0367  
#0368  
#0369  
#0370  
#0371  
#0372  
#0373  
#0374  
#0375  
#0376  
#0377  
#0378  
#0379  
#0380  
#0381  
#0382  
#0383  
#0384  
#0385  
#0386  
#0387  
#0388  
#0389  
#0390  
#0391  
#0392  
#0393  
#0394  
#0395  
#0396  
#0397  
#0398  
#0399  
#0400  
#0401  
#0402  
#0403  
#0404  
#0405  
#0406  
#0407  
#0408  
#0409  
#0410  
#0411  
#0412  
#0413  
#0414  
#0415  
#0416  
#0417  
#0418  
#0419  
#0420  
#0421  
#0422  
#0423  
#0424  
#0425  
#0426  
#0427  
#0428  
#0429  
#0430  
#0431  
#0432  
#0433  
#0434  
#0435  
#0436  
#0437  
#0438  
#0439  
#0440  
#0441  
#0442  
#0443  
#0444  
#0445  
#0446  
#0447  
#0448  
#0449  
#0450  
#0451  
#0452  
#0453  
#0454  
#0455  
#0456  
#0457  
#0458  
#0459  
#0460  
#0461  
#0462  
#0463  
#0464  
#0465  
#0466  
#0467  
#0468  
#0469  
#0470  
#0471  
#0472  
#0473  
#0474  
#0475  
#0476  
#0477  
#0478  
#0479  
#0480  
#0481  
#0482  
#0483  
#0484  
#0485  
#0486  
#0487  
#0488  
#0489  
#0490  
#0491  
#0492  
#0493  
#0494  
#0495  
#0496  
#0497  
#0498  
#0499  
#0500  
#0501  
#0502  
#0503  
#0504  
#0505  
#0506  
#0507  
#0508  
#0509  
#0510  
#0511  
#0512  
#0513  
#0514  
#0515  
#0516  
#0517  
#0518  
#0519  
#0520  
#0521  
#0522  
#0523  
#0524  
#0525  
#0526  
#0527  
#0528  
#0529  
#0530  
#0531  
#0532  
#0533  
#0534  
#0535  
#0536  
#0537  
#0538  
#0539  
#0540  
#0541  
#0542  
#0543  
#0544  
#0545  
#0546  
#0547  
#0548  
#0549  
#0550  
#0551  
#0552  
#0553  
#0554  
#0555  
#0556  
#0557  
#0558  
#0559  
#0560  
#0561  
#0562  
#0563  
#0564  
#0565  
#0566  
#0567  
#0568  
#0569  
#0570  
#0571  
#0572  
#0573  
#0574  
#0575  
#0576  
#0577  
#0578  
#0579  
#0580  
#0581  
#0582  
#0583  
#0584  
#0585  
#0586  
#0587  
#0588  
#0589  
#0590  
#0591  
#0592  
#0593  
#0594  
#0595  
#0596  
#0597  
#0598  
#0599  
#0600  
#0601  
#0602  
#0603  
#0604  
#0605  
#0606  
#0607  
#0608  
#0609  
#0610  
#0611  
#0612  
#0613  
#0614  
#0615  
#0616  
#0617  
#0618  
#0619  
#0620  
#0621  
#0622  
#0623  
#0624  
#0625  
#0626  
#0627  
#0628  
#0629  
#0630  
#0631  
#0632  
#0633  
#0634  
#0635  
#0636  
#0637  
#0638  
#0639  
#0640  
#0641  
#0642  
#0643  
#0644  
#0645  
#0646  
#0647  
#0648  
#0649  
#0650  
#0651  
#0652  
#0653  
#0654  
#0655  
#0656  
#0657  
#0658  
#0659  
#0660  
#0661  
#0662  
#0663  
#0664  
#0665  
#0666  
#0667  
#0668  
#0669  
#0670  
#0671  
#0672  
#0673  
#0674  
#0675  
#0676  
#0677  
#0678  
#0679  
#0680  
#0681  
#0682  
#0683  
#0684  
#0685  
#0686  
#0687  
#0688  
#0689  
#0690  
#0691  
#0692  
#0693  
#0694  
#0695  
#0696  
#0697  
#0698  
#0699  
#0700  
#0701  
#0702  
#0703  
#0704  
#0705  
#0706  
#0707  
#0708  
#0709  
#0710  
#0711  
#0712  
#0713  
#0714  
#0715  
#0716  
#0717  
#0718  
#0719  
#0720  
#0721  
#0722  
#0723  
#0724  
#0725  
#0726  
#0727  
#0728  
#0729  
#0730  
#0731  
#0732  
#0733  
#0734  
#0735  
#0736  
#0737  
#0738  
#0739  
#0740  
#0741  
#0742  
#0743  
#0744  
#0745  
#0746  
#0747  
#0748  
#0749  
#0750  
#0751  
#0752  
#0753  
#0754  
#0755  
#0756  
#0757  
#0758  
#0759  
#0760  
#0761  
#0762  
#0763  
#0764  
#0765  
#0766  
#0767  
#0768  
#0769  
#0770  
#0771  
#0772  
#0773  
#0774  
#0775  
#0776  
#0777  
#0778  
#0779  
#0780  
#0781  
#0782  
#0783  
#0784  
#0785  
#0786  
#0787  
#0788  
#0789  
#0790  
#0791  
#0792  
#0793  
#0794  
#0795  
#0796  
#0797  
#0798  
#0799  
<?php
/**
 * Form methods go here.
 * @package Form Helpers
 * @todo
 *  - check/fix start_form_tag() hidden fields
 */
 
/**
 * Prints out a formatted errors message box for an object. Erros
 * styles below: 
 *
 * <code>
 * #errors {} // container div
 * #errors .top {} 
 * #errors .body {}
 * #errors .bottom {}
 * #errors h1 {} // title
 * #errors p {} // description
 * #errors ul {} // errors list
 * #errors li {} // errors list items
 * #errors a {} // errors list items links
 * .errors_field {} // html element with the error
 * </code>
 *
 * @author Nesebrt Hidalgo
 * @name_or_object string/object optional
 * @param string $title optional default is "{number of errors} errors {have or has} prohibited this {object name} from being saved."
 * @param string $description optional default is "There were problems with th following fields."
 * @todo make accept arrays and objects
 * @return string
 */

function error_messages_for($errors null$title null$description 'There were problems with the following fields.')
{
    
// if no errors check global variable
    
if ( !$errors $errors $_ENV['model_error'];

    switch ( 
true ) {
    
        case ( 
is_object($errors) ):
            if ( 
$errors_count $errors->errors->count() ) { 
                
$model get_class($errors);
                
$errors $errors->errors;
            } else {
                return;
            }
        break;
        
        case ( 
is_array($errors) ):
            
$errors_count =    count($errors);
        break;
        
    }
    
    if ( 
$errors_count ) {
    
        
$title = ( $title $title "{$errors_count} error".( $errors_count == ' has' 's have' )." prohibited this ".( $model humanize($model) : 'Form' )." from being saved." );
        
$title str_replace(array('@@errors_count@@','@@title@@'), array($errors_count$title), $title);
        
    
?>
    <div class="errors">
    
        <div class="top"></div>
    
        <div class="body">
            <?=$title '<h1 class="error_title">'.$title.'</h1>' '' )?>
            <?=$description '<p>'.$description.'</p>' '' )?>
            <ul>
                <? foreach ( $errors as $field => $message ) { ?>
                    <? if ( $message == 'no_message') continue; ?>
                <li><a href="#error_<?=$error?>"><?=$message?></a></strong></li>
                <? ?>
            </ul>
        </div>
        
        <div class="bottom"></div>
    
    </div>        
    <?
    
}

}

/**
 * Creates an ancohor tag and wraps the form element with an span tag
 * if it has an error.
 *
 * @author Nesebrt Hidalgo
 * @param string $html_str
 * @return string
 */
function error_check($html_str)
{
    if ( 
is_array($_ENV['model_error']) ) foreach ( $_ENV['model_error'] as $field => $vals ) {
        
        
// need to figure out a better way of doing this [NH] 11/9/20005
        
if ( strstr($html_str'['.$field.']') || ( strstr($html_str'"'.$field.'"') && !strstr($html_str'value="'.$field.'"') ) ) {
            
$html_str '<a name="error_'.$field.'"></a><span class="errors_field">'.$html_str.'</span>';
        }
        
    }    
    return 
$html_str;    
}

/**
 * Creates the start form tag.
 *
 * @author Nesbert Hidalgo
 * @param array $event_options required
 * @param sting/object $name_or_obj required
 * @param mixed $value optional
 * @param string $method optional default set to "post"
 * @param array $html_options optional
 * @return string
 */
 
function start_form_tag($event_options$name_or_obj null$name_value null$method 'post'$html_optionsnull) {

    if ( 
$name_or_obj ) {    
        if ( 
is_object($name_or_obj) ) {
            
$obj_id_str hidden_field(str_replace('_model'''get_class($name_or_obj)).'[id]'$name_or_obj->id);
        } else {
            
$obj_id_str hidden_field($name_or_obj$name_value)."\n";
        }
    }
    
    
$event_arr get_event_params();
    
    if ( !
in_array('controller'array_keys($event_options)) ) {
        
$event_options['controller'] = $event_arr['controller'];
    }

    if ( !
in_array('action'array_keys($event_options)) ) {
        
$event_options['action'] = $event_arr['action'];
    }

    if ( !
in_array('id'array_keys($event_options)) ) {
        
$event_options['id'] = $event_arr['id'];
    }
    
    if ( 
$event_options['id'] ) {
        
$obj_id_str .= hidden_field('id'$event_options['id'])."\n";
    }
    
    return 
'<form method="'.$method.'" id="form_'.$event_options['controller'].'" name="form_'.$event_options['controller'].'" action="'.url_for($event_options['controller'], $event_options['action'], $event_options['id']).'"'.html_options_str($html_options).'>'."\n".$obj_id_str;
    
}

/**
 * Creates the start form tag.
 *
 * @author Nesbert Hidalgo
 * @param array $options required
 * @return string
 */
 
function form_tag($options) {
    return 
'<form method="'.( $options['method'] ? $options['method'] : 'post' ).'"'.( $options['controller'] ? ' id="form_'.$options['controller'].( $options['action'] ? '_'.$options['action'] : '' ).'"' '' ).( $options['controller'] ? ' name="form_'.$options['controller'].( $options['action'] ? '_'.$options['action'] : '' ).'"' '' ).' action="'.url_for($options['controller'], $options['action'], $options['id']).'"'.html_options_str($options).'>'."\n";
}

/**
 * Creates the end form tag for lazy programmers or anal ones!.
 *
 * @author Nesbert Hidalgo
 */
 
function end_form_tag() {
    return 
"</form>\n";
}

/**
 * Formats user[name] to user_name.
 *
 * @author Nesbert Hidalgo
 * @return string
 */
 
function name_to_id($name) {
    
    return 
str_replace(array('['']'), array('_'''), str_replace('[]'''$name));

}

/**
 * Base function used to create the different types of input tags.
 *
 * @author Nesbert Hidalgo
 * @return string
 */
 
function create_input_tag($type$name$value null$html_options null$on_value null$text null) {

    if (
is_string($text)) {
        
$append_text $text;
    } else {
        
$prepend_text $text[0];
        
$append_text $text[1];
    }

    if ( 
$value == $on_value $html_options['checked'] = 'checked';
    
$id name_to_id($name).( $type == 'radio' || $type == 'checkbox' '_'.str_replace(' '''$value) : '' );
    return 
error_check($prepend_text.' <input type="'.$type.'" id="'.$id.'" name="'.$name.'" value="'.$value.'"'.html_options_str($html_options).' /> '.$append_text);
    
}

/**
 * Creates a text input tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function text_field($name$value ''$html_options null$text null) {

    return 
create_input_tag('text'$name$value$html_optionsnull$text);

}

/**
 * Creates a hidden text input tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function hidden_field($name$value ''$html_options null) {

    return 
create_input_tag('hidden'$name$value$html_options);

}

/**
 * Creates a password text input tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function password_field($name$value ''$html_options null$text null) {

    return 
create_input_tag('password'$name$value$html_options$text);

}

/**
 * Creates a radio button input tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @param string $on_value optional
 * @return string
 */ 

function radio_button($name$value ''$html_options null$on_value null$text null) {

    return 
create_input_tag('radio'$name$value$html_options$on_value$text);

}

/**
 * Creates a checkbox input tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @param string $on_value optional
 * @return string
 */ 

function check_box($name$value ''$html_options null$on_value null$text null) {

    return 
create_input_tag('checkbox'$name$value$html_options$on_value$text);

}

/**
 * Creates a submit tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function submit_tag($name ''$value 'Submit'$html_options null) {

    return 
create_input_tag('submit'$name$value$html_options);

}

/**
 * Creates a button tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function button_tag($name ''$value 'Button'$html_options null) {

    return 
create_input_tag('button'$name$value$html_options);

}

/**
 * Creates a textarea tag.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $value optional
 * @param array $html_options optional
 * @return string
 */ 

function text_area($name$value ''$html_options null) {

    return 
error_check('<textarea id="'.name_to_id($name).'" name="'.$name.'"'.html_options_str($html_options).'>'.$value.'</textarea>');

}

/**
 * Creates a label tag. Modified to accept html_options [NH] 2/3
 *
 * @author Russ Smith
 * @param string $name required
 * @param string $field required
 * @param boolean $required required
 * @return string
 */ 

function label_tag($name$field$required true$html_options null)
{

    
$html_options['class'] = ( $required ' required' '' ) . ( is_array($GLOBALS['form_errors']) && in_array($fieldarray_keys($GLOBALS['form_errors'])) ? ' errors_field' '' ) . ' ' $html_options['class'];

    return 
'<label for="'.$field.'"'.html_options_str($html_options).'>'.$name.'</label>';
}

/**
 * Creates a select tag (dropdown box). Can't beat this!!!
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param mix $selected optional 
 * @param array $choices optional
 * @param array $html_options optional
 * @param string $none_title optional default set to "None Available"
 * @return string
 */ 

function select($name$selected ''$choices null$html_options null$none_title 'None Available'$have_none false) {

    
$return '<select name="'.$name.'" id="'.name_to_id($name).'"'.html_options_str($html_options).">\n\r";
    
    if ( 
count($choices) ) {
        
        if (
$have_none) {
            
$return .= "<option value=\"\">{$none_title}</option>\n\r";
        }    
        foreach ( 
$choices as $value => $description ) {
            if (!
is_array($description)) {
                
//$value = ( is_assoc_array($choices) ? $value : $description );
                
if (is_array($selected)) {
                    
$select_str = ( in_array($value$selected) ? ' selected="selected"' '' );
                } else {
                    
$select_str = ( $selected == $value ' selected="selected"' '' );
                }
                
$return .= '<option value="'.$value.'"'.$select_str.'>'.($description?$description:$value)."</option>\n\r";
            } else {
                
$value = ( is_assoc_array($choices) ? $value $description['name'] );
                if (
is_array($selected)) {
                    
$select_str = ( in_array($value$selected) ? ' selected="selected"' '' );
                } else {
                    
$select_str = ( $selected == $value ' selected="selected"' '' );
                }
                
                
$return .= '<option value="'.$value.'"'.$select_str.'>'.($description['name']?$description['name']:$value)."</option>\n\r";
                
                if (
is_array($description['children'])) {
                    foreach(
$description['children'] as $value2 => $description2) {
                        
$value2 = ( is_assoc_array($choices) ? $value2 $description2 );
                        if (
is_array($selected)) {
                            
$select_str = ( in_array($value2$selected) ? ' selected="selected"' '' );
                        } else {
                            
$select_str = ( $selected == $value2 ' selected="selected"' '' );
                        }
                        
                        
$return .= '<option value="'.$value2.'"'.$select_str.'> - '.($description2?$description2:$value2)."</option>\n\r";
                    }
                }
            
            }
        }
    
    } else {
    
        
$return .= "<option value=\"\">{$none_title}</option>\n\r";
        
    }

    
$return .= "</select>\n\r";

    return 
error_check($return);

}

/**
 * Creates a select tag (dropdown box). Can't beat this!!!
 *
 * @author John Faircloth, Nesbert Hidalgo
 * @param string $name required
 * @param mix $selected optional 
 * @param array $choices optional
 * @param array $html_options optional
 * @param string $none_title optional default set to "None Available"
 * @return string
 */ 

function checkbox_select($name$selected = array(), $choices null$html_options null$none_title 'None Available'$have_none false) {
    
    if ( !
is_array($selected) ) $selected = array();
    
    if ( 
$html_options['label_options'] ) {
        
$label_options $html_options['label_options'];
        unset(
$html_options['label_options']);
    }
    
    
$box_html_options = array();

    if ( 
is_array($html_options) && count($html_options) > ) {
    
        foreach ( 
$html_options as $key=>$value ) {
            if (
strtolower(substr(trim($key), 02)) == 'on') {
                
$box_html_options[$key] = $value;
            }
        }
        
        foreach ( 
$box_html_options as $key=>$value ) {
            unset(
$html_options[$key]);
        }
        
    }

    
$return "<div "html_options_str($html_options) .">\n";
    
    if ( 
count($choices) ) {
    
        
$class_temp $label_options['class'];
    
        foreach( 
$choices as $value => $desc ) {
            
$label_options['class'] = $class_temp . ( strstr($desc'class="sub"') ? '_sub' '' ) . ' row ' cycle('row-1''row-2');
            
$label_options['for'] = name_to_id($name) . '_' $value;
            
$return .= "<label ".html_options_str($label_options).">\n";
            
$return .= create_input_tag('checkbox'$name$value$box_html_optionsin_array($value$selected), $desc)."\n";
            
$return .= "<br /></label>\n";        
        }
        
    } else {
        
$return .= '<span class="'.underscore($none_title).'">'.$none_title.'</span>';
    }
    
    
$return .= "</div>\n";
    
    return 
$return;
}


/**
 * Creates dropdown of states.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $selected optional
 * @param array $choices optional
 * @param array $html_options optional
 * @return string
 */
 
function select_states_tag($name$selected null$choices null$html_options null$select_all false) {

    if (!
$select_all) {
        
$choices = ( $choices $choices : array('' => 'Please select...') );
    } else {
        
$choices = ( $choices $choices : array('all' => 'All States..') );
    }
    
    
$state = new state_country_model();
    
    
$state_arr array_merge($choices$state->get_states_by_country_code());
    
    return 
select($name$selected$state_arr$html_options);
    
}

/**
 * Creates dropdown of countries. if $state_id is it will automatically populate those
 * values depending on the contry selected.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param string $selected optional
 * @param array $choices optional
 * @param array $html_options optional
 * @param array $state_id optional will update the states depending on the country selected
 * @return string
 */
 
function select_countries_tag($name$selected null$choices null$html_options null$state_id null) {

    
$choices = ( $choices $choices : array('' => 'Please select...') );
    
    
$country = new state_country_model();
    
$country_arr array_merge($choices$country->get_countries());

    
$html_options['onchange'] .= 'set_'.$state_id.'();';    
    
    
$return select($name$selected$country_arr$html_options);
    
    
// automatic state dropdown update
    
if ( $state_id ) {
    
        
$state = new state_country_model();
        
$state->load_states_by_country_code();
        
        while ( 
$state->get_next() ) {
            
$usaVals[] = $state->get_description();
            
$usaIDs[] = $state->get_state();
        }

        
$state->load_states_by_country_code('Canada');
    
        while ( 
$state->get_next() ) {
            
$canadaVals[] = $state->get_description();
            
$canadaIDs[] = $state->get_state();
        }
        
        
?>
        <script language="javascript" type="text/javascript">
        <!--
        function set_<?=$state_id?>() {
            
            var usaVals = new Array("<?=implode('", "'$usaVals)?>");
            var usaIDs = new Array("<?=implode('", "'$usaIDs)?>");
            var canadaVals = new Array("<?=implode('", "'$canadaVals)?>");
            var canadaIDs = new Array("<?=implode('", "'$canadaIDs)?>");
            var countryDrop = document.getElementById("<?=name_to_id($name)?>");
            var selectedCountry = countryDrop.options[countryDrop.selectedIndex].value;
            
            switch ( selectedCountry ) {
                case "United States":
                case "USA":
                    update_<?=$state_id?>(usaVals, usaIDs);
                break;
                case "Canada":
                    update_<?=$state_id?>(canadaVals, canadaIDs);
                break;
                default:
                    update_<?=$state_id?>();
                break;
            }
        }
        
        function update_<?=$state_id?>(stateVals, stateIDs) {
            
            var stateDrop = document.getElementById("<?=$state_id?>");
            stateDrop.options.length = 0;
            stateDrop.options[stateDrop.options.length] = new Option("Please select...", "");
            
            if ( stateVals ) {
                for(var i=0; i<stateVals.length; i++) {
                    stateDrop.options[stateDrop.options.length] = new Option(stateVals[i], stateIDs[i]);
                    stateDrop.options[0].selected = true;
                }
            } else {
                stateDrop.options.length = 0;
                stateDrop.options[stateDrop.options.length] = new Option("None Available", "");
                stateDrop.options.selected = true;
            }
            
        };
        -->
        </script>
        <?
    
}
    
    return 
$return;
    
}

/**
 * Creates dropdown that redirects the page onchange.
 *
 * @author Nesbert Hidalgo
 * @param string $name required
 * @param array $names_and_urls requires
 * @param array $html_options optional
 * @return string
 */
 
function select_redirect($name$names_and_urls$html_options null) {
    
    
$html_options['onchange'] .= 'location.href=this.options[this.selectedIndex].value;';    
    
    
$return select($namenull$names_and_urls$html_options);
    return 
$return;
    
}


/**
 * Create date selectboxes
 * 
 * @author Nesbert
 * @access public
 * @param string $name 
 * @param mixed $date
 * @return string
 */
function date_select($name$date null)
{
    switch ( 
true ) {
    
        case ( !
$date  || ($date == '0000-00-00 00:00:00') ):
            
$date time();
        break;
        
        case ( 
is_array($date) ):
            
$date mktime($date['hour'], $date['minute'], $date['second'], $date['month'], $date['day'], $date['year']);
        break;
        
        case ( 
is_numeric($date) ):
        break;
        
        case ( 
is_string($date) ):
            
$date strtotime($date);
        break;    
        
    }
    
    
$i 1;
    
$months = array();
    while (
$i <= 12) { $months[$i] = $i$i++; }    

    
$i 1;
    
$days = array();
    while (
$i <= 31) { $days[$i] = $i$i++; }    

    
$i = (date('Y') - 3);
    
$years = array();
    while (
$i <= (date('Y') + 3)) { $years[$i] = $i$i++; }    

    
$out "";
    
$out .= select("{$name}[month]"date('m'$date), $months);
    
$out .= select("{$name}[day]"date('j'$date), $days);
    
$out .= select("{$name}[year]"date('Y'$date), $years);

    return 
$out;
}

function 
time_select($name$time null)
{
    
$time = ($time == null) ? mktime() : $time;

    
$i 1;
    
$hours = array();
    while (
$i <= 12) { $hours[$i] = $i$i++; }    

    
$i 0;
    
$minutes = array();
    while (
$i <= 59) { $minutes[sprintf("%02d"$i)] = sprintf("%02d"$i); $i++; }    

    
$ampm['AM'] = 'AM';
    
$ampm['PM'] = 'PM';

    
$out "";
    
$out .= select("{$name}[hour]"date('g'$time), $hours);
    
$out .= select("{$name}[minute]"date('i'$time), $minutes);
    
$out .= select("{$name}[ampm]"date('A'$time), $ampm);

    return 
$out;
}

function 
date_time_select($name$datetime null)
{
    return 
date_select($name$datetime)." @ ".time_select($name$datetime);
}

function 
get_timestamp_from_post($key)
{
    
$_POST[$key]['hour'] = ($_POST[$key]['ampm'] == 'pm') ? ($_POST[$key]['hour'] + 12) : $_POST[$key]['hour'];
    return 
mktime($_POST[$key]['hour'], $_POST[$key]['minute'], 0$_POST[$key]['month'], $_POST[$key]['day'], $_POST[$key]['year']);
}

function 
select_time_zone_tag($name$selected null$choices null$html_options null)
{
        
$time_zones = array(
            
"US & Canada" => "US/Pacific",
            
"-10:00 Hawaii" => "US/Hawaii",
            
"-09:00 Alaska" => "US/Alaska",
            
"-08:00 Pacific Time" => "US/Pacific",
            
"-08:00 Pacific Time (Yukon)" =>"Canada/Yukon",
            
"-07:00 Arizona" => "US/Arizona",
            
"-07:00 Mountain Time" => "US/Mountain",
            
"-06:00 Central Time" => "US/Central",
            
"-06:00 Saskatchewan" => "Canada/Saskatchewan",
            
"-06:00 Saskatchewan (East)" => "Canada/East-Saskatchewan",
            
"-05:00 Eastern Time" => "US/Eastern",
            
"-05:00 Eastern Time (Michigan)" => "US/Michigan",
            
"-05:00 Indiana (East)" => "US/East-Indiana",
            
"-05:00 Indiana (Starke)" => "US/Indiana-Starke",
            
"-04:00 Atlantic Time (Canada)" => "Canada/Atlantic",
            
"-03:30 Newfoundland" => "Canada/Newfoundland",
            
"International" => "GMT",
            
"-12:00 Eniwetok, Kwajalein" => "Pacific/Kwajalein",
            
"-11:00 Midway Island, Samoa" => "US/Samoa",
            
"-06:00 Central America" => "Etc/GMT-6",
            
"-06:00 Mexico City" => "America/Mexico_City",
            
"-05:00 Bogota, Lima, Quito" => "America/Bogota",
            
"-04:00 Caracas, La Paz" => "America/Caracas",
            
"-04:00 Santiago" => "America/Santiago",
            
"-03:00 Brasilia" => "Brazil/West",
            
"-03:00 Greenland" => "Etc/GMT-3",
            
"-02:00 Mid-Atlantic" => "Etc/GMT-2",
            
"-01:00 Azores" => "Atlantic/Azores",
            
"-01:00 Cape Verde Is." => "Atlantic/Cape_Verde",
            
"GMT Casablanca, Monrovia" => "Africa/Casablanca",
            
"Greenwich Mean Time GMT: Dublin, Edinburgh, Lisbon, London" => "GMT",
            
"+01:00 Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna" => "Etc/GMT+1",
            
"+01:00 Belgrade, Bratislava, Budapest, Ljubljana, Prague" => "Etc/GMT+1",
            
"+01:00 Brussels, Copenhagen, Madrid, Paris" => "Etc/GMT+1",
            
"+01:00 Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb" => "Etc/GMT+1",
            
"+01:00 West Central Africa" => "Etc/GMT+1",
            
"+02:00 Athens, Istanbul, Minsk" => "Etc/GMT+2",
            
"+02:00 Bucharest" => "Etc/GMT+2",
            
"+02:00 Cairo" => "Etc/GMT+2",
            
"+02:00 Harare, Pretoria" => "Etc/GMT+2",
            
"+02:00 Helsinki, Riga, Tallinn" => "Etc/GMT+2",
            
"+02:00 Jarusalem" => "Etc/GMT+2",
            
"+03:00 Baghdad" => "Etc/GMT+3",
            
"+03:00 Kuwait, Riyadh" => "Etc/GMT+3",
            
"+03:00 Moscow, St. Peter sburg, Volgograd" => "Etc/GMT+3",
            
"+03:00 Nairobi"=> "Etc/GMT+3",
            
"+03:30 Tehran" => "Etc/GMT+3",
            
"+04:00 Abu Dhabi, Muscat" => "Etc/GMT+4",
            
"+04:00 Baku, bilisi, erevan" => "Etc/GMT+4",
            
"+04:30 Kabul" => "Asia/Kabul",
            
"+05:00 Ekaterinburg" => "Etc/GMT+5",
            
"+05:00Islamabad, Karachi, Tashkent" => "Etc/GMT+5",
            
"+05:30 Calcutta, Chennai, Mumbai, New Delhi" => "Asia/Calcutta",
            
"+05:45 Kathmandu" => "Asia/Katmandu",
            
"+06:00 Almatay, Novosibirsk" => "Etc/GMT+6",
            
"+06:00Astana, Dhaki" => "Etc/GMT+6",
            
"+06:00 Sri Jayawardenepura" => "Etc/GMT+6",
            
"+06:30 Rangoon" => "Asia/Rangoon",
            
"+07:00 Bangkok, Hanoi, Jakarta" => "Etc/GMT+7",
            
"+07:00 Krasnoyarsk" => "Etc/GMT+7",
            
"+08:00Beijing, Chongqing, Hong Kong, Urumqi" => "Etc/GMT+8",
            
"+08:00 Irkutsk, Ulaan Bataar" => "Etc/GMT+8",
            
"+08:00 Kuala Lumpur, Singapore" => "Etc/GMT+8",
            
"+08:00 Perth" => "Etc/GMT+8",
            
"+08:00Taipei" => "Etc/GMT+8",
            
"+09:00 Osaka, Sapporo, Tokyo" => "Etc/GMT+9",
            
"+09:00 Seoul" => "Etc/GMT+9",
            
"+09:00 Yakutsk" => "Etc/GMT+9",
            
"+09:30 Adelaide" => "Etc/GMT+9",
            
"+09:30 Darwin" => "Australia/Darwin",
            
"+10:00 Brisbane" => "Etc/GMT+10",
            
"+10:00 Canberra, Melbourne, Sydney" => "Etc/GMT+10",
            
"+10:00 Guam, Port Moresby" => "Etc/GMT+10",
            
"+10:00 Hobart" => "Etc/GMT+10",
            
"+10:00 Vladivostok" => "Etc/GMT+10",
            
"+11:00 Magadan, Solomon Is., New Caledonia" => "Etc/GMT+11",
            
"+12:00 Auckland, ellington" => "Etc/GMT+12",
            
"+12:00 Fiji, Kamchatka, Marshall Is." => "Etc/GMT+12"
    
);

    
$choices = ( $choices $choices : array('' => 'Please select...') );
    
$time_zones array_merge($choices$time_zones);
    
    return 
select($name$selected$time_zones$html_options);
}

?>