/**
 * Function to add the JQuery form validator to a form.
 *
 * the parameters in $params are:
 *
 * 'form' - the form object, must be a Zend_Form or an inherited class of that
 *
 * @param array $params An array of the parameters to make up the URL
 * @param Smarty $smarty A reference to the Smarty template object
 * @return string
 */
function smarty_function_addJSValidator($params, &$smarty)
{
    if (!isset($params['form']) || !is_object($params['form']) || !is_subclass_of($params['form'], 'Zend_Form')) {
        return '';
    }
    $validationRules = array();
    $formObj = $params['form'];
    __vimbadmin_getFormElements($formObj, $validationRules);
    if (sizeof($formObj->getSubForms()) != 0) {
        foreach ($formObj->getSubForms() as $subForm) {
            __vimbadmin_getFormElements($subForm, $validationRules);
        }
    }
    $ruleStr = "\n\n<script type=\"text/javascript\"> /* <![CDATA[ */\n\n    \$(document).ready(function() {\n        \$('#" . $formObj->getId() . "').validate({\n            rules: {\n";
    foreach ($validationRules as $fieldId => $ruleSet) {
        $ruleStr .= "                '{$fieldId}': {";
        foreach ($ruleSet as $ruleKey => $ruleValue) {
            if ($ruleKey == 'field_type') {
                continue;
            }
            if (!isset($ruleSet['required'])) {
                $ruleSet['required'] = false;
            }
            if (isset($ruleSet['field_type']) && $ruleSet['field_type'] == 'Zend_Form_Element_Checkbox' && $ruleSet['required']) {
                $ruleStr .= " isChecked: true,";
                continue;
            }
            $ruleStr .= " {$ruleKey}: ";
            switch (getType($ruleValue)) {
                case 'boolean':
                    $ruleStr .= $ruleValue == true ? 'true' : 'false';
                    break;
                case 'integer':
                case 'double':
                    $ruleStr .= $ruleValue;
                    break;
                case 'array':
                    if (sizeof($ruleValue)) {
                        $ruleStr .= '[ ';
                        foreach ($ruleValue as $key => $oneValue) {
                            switch (getType($oneValue)) {
                                case 'integer':
                                case 'double':
                                    $ruleStr .= $oneValue . ', ';
                                    break;
                                case 'boolean':
                                    $ruleStr .= ($oneValue == true ? 'true' : 'false') . ', ';
                                    break;
                                case 'string':
                                default:
                                    $ruleStr .= "'{$oneValue}', ";
                                    break;
                            }
                        }
                        $ruleStr = substr(trim($ruleStr), 0, -1) . ' ]';
                    } else {
                        $ruleStr .= '[ ]';
                    }
                    break;
                case 'object':
                    $ruleStr .= '{ ';
                    foreach ($ruleValue as $key => $oneValue) {
                        $ruleStr .= $key . ': ';
                        switch (getType($oneValue)) {
                            case 'integer':
                            case 'double':
                                $ruleStr .= $oneValue . ', ';
                                break;
                            case 'boolean':
                                $ruleStr .= ($oneValue == true ? 'true' : 'false') . ', ';
                                break;
                            case 'string':
                            default:
                                $ruleStr .= "'{$oneValue}', ";
                                break;
                        }
                    }
                    $ruleStr = substr(trim($ruleStr), 0, -1) . ' }';
                    break;
                case 'string':
                default:
                    $ruleStr .= "'{$ruleValue}'";
                    break;
            }
            $ruleStr .= ",";
        }
        $ruleStr = mb_substr(trim($ruleStr), 0, -1);
        $ruleStr .= " },\n";
    }
    $ruleStr = mb_substr(trim($ruleStr), 0, -1) . "\n";
    $ruleStr .= "            }\n        });\n    });\n\n/* ]]> */ </script>\n\n";
    return $ruleStr;
}
/**
 * Function to add the JQuery form validator to a form.
 *
 * the parameters in $params are:
 *
 * 'form' - the form object, must be a Zend_Form or an inherited class of that
 *
 * @category   OSS
 * @package    OSS_Smarty
 * @subpackage Functions
 *
 * @param array $params An array of the parameters to make up the URL
 * @param Smarty $smarty A reference to the Smarty template object
 * @return string
 */
function smarty_function_addJSValidator($params, &$smarty)
{
    if (!isset($params['form']) || !is_object($params['form']) || !is_subclass_of($params['form'], 'Zend_Form')) {
        return '';
    }
    $validationRules = array();
    $formObj = $params['form'];
    __vimbadmin_getFormElements($formObj, $validationRules);
    if (sizeof($formObj->getSubForms()) != 0) {
        foreach ($formObj->getSubForms() as $subForm) {
            __vimbadmin_getFormElements($subForm, $validationRules);
        }
    }
    $ruleStr = "\n\n<script type=\"text/javascript\">\n\n    \$(document).ready(function() {\n        \$('#" . $formObj->getId() . "').validate({\n            rules: {\n";
    foreach ($validationRules as $fieldId => $ruleSet) {
        $ruleStr .= "                '{$fieldId}': {";
        foreach ($ruleSet as $ruleKey => $ruleValue) {
            if ($ruleKey == 'field_type') {
                continue;
            }
            if (!isset($ruleSet['required'])) {
                $ruleSet['required'] = false;
            }
            if (isset($ruleSet['field_type']) && $ruleSet['field_type'] == 'Zend_Form_Element_Checkbox' && $ruleSet['required']) {
                $ruleStr .= " isChecked: true,";
                continue;
            }
            $ruleStr .= " {$ruleKey}: ";
            switch (getType($ruleValue)) {
                case 'boolean':
                    $ruleStr .= $ruleValue == true ? 'true' : 'false';
                    break;
                case 'integer':
                case 'double':
                    $ruleStr .= $ruleValue;
                    break;
                case 'array':
                    if (sizeof($ruleValue)) {
                        $ruleStr .= '[ ';
                        foreach ($ruleValue as $key => $oneValue) {
                            switch (getType($oneValue)) {
                                case 'integer':
                                case 'double':
                                    $ruleStr .= $oneValue . ', ';
                                    break;
                                case 'boolean':
                                    $ruleStr .= ($oneValue == true ? 'true' : 'false') . ', ';
                                    break;
                                case 'string':
                                default:
                                    $ruleStr .= "'{$oneValue}', ";
                                    break;
                            }
                        }
                        $ruleStr = substr(trim($ruleStr), 0, -1) . ' ]';
                    } else {
                        $ruleStr .= '[ ]';
                    }
                    break;
                case 'object':
                    $ruleStr .= '{ ';
                    foreach ($ruleValue as $key => $oneValue) {
                        $ruleStr .= $key . ': ';
                        switch (getType($oneValue)) {
                            case 'integer':
                            case 'double':
                                $ruleStr .= $oneValue . ', ';
                                break;
                            case 'boolean':
                                $ruleStr .= ($oneValue == true ? 'true' : 'false') . ', ';
                                break;
                            case 'string':
                            default:
                                $ruleStr .= "'{$oneValue}', ";
                                break;
                        }
                    }
                    $ruleStr = substr(trim($ruleStr), 0, -1) . ' }';
                    break;
                case 'string':
                default:
                    $ruleStr .= "'{$ruleValue}'";
                    break;
            }
            $ruleStr .= ",";
        }
        $ruleStr = mb_substr(trim($ruleStr), 0, -1);
        $ruleStr .= " },\n";
    }
    $ruleStr = mb_substr(trim($ruleStr), 0, -1) . "\n";
    $ruleStr .= "            },\n        errorElement: 'span',\n        errorPlacement: function (error, element) {\n                                var id = element.attr('id');\n                                error.appendTo( '#help-' + id );\n                             },\n        highlight: function (element, errorClass ) {\n                                var id = element['id'];\n                                var wraper = \$( '#' + id ).closest( '.control-group' );\n                                wraper.addClass( 'error' );\n                                var parent = false;\n                                if( wraper.parent().hasClass( 'tab-pane' ) )\n                                    parent = wraper.parent();\n                                else if( ( wraper.parent().parent().hasClass( 'row' ) || wraper.parent().parent().hasClass( 'row-fluid' ) ) && wraper.parent().parent().parent().hasClass( 'tab-pane' ) )\n                                    parent = wraper.parent().parent().parent();\n\n                                if( parent )\n                                    \$( 'a[href|=\"#' + parent.attr( 'id' ) + '\"]' ).addClass( 'text-error' );\n                             },\n        unhighlight: function(element, errorClass, validClass){\n                                var id = element['id'];\n                                var wraper = \$( '#' + id ).closest( '.control-group' );\n                                wraper.removeClass( 'error' );\n                                var parent = false\n                                if( wraper.parent().hasClass( 'tab-pane' ) )\n                                    parent = wraper.parent();\n                                else if( ( wraper.parent().parent().hasClass( 'row' ) || wraper.parent().parent().hasClass( 'row-fluid' ) ) && wraper.parent().parent().parent().hasClass( 'tab-pane' ) )\n                                    parent = wraper.parent().parent().parent();\n\n                                wraper.find( '.help-block' ).each( function(){\n                                    if( \$( this ).is( 'span' ) )\n                                        \$( this ).remove();\n                                });\n\n                                if( parent )\n                                {\n                                    if( !parent.find( '.error' ).find( '.control-label' ).length )\n                                        \$( 'a[href|=\"#' + parent.attr( 'id' ) + '\"]' ).removeClass( 'text-error' );\n                                }\n                            }                    \n        });\n    });\n\n</script>\n\n";
    return $ruleStr;
}