/**
  * Render a date JUI widget
  * @return The element's content as a string.
  */
 protected function renderControlEditable()
 {
     $valueTypeId = $this->getValueTypeEditableInputId();
     $firstDateSpanAreaSuffix = '-first-date-area';
     $secondDateSpanAreaSuffix = '-second-date-area';
     $firstDateSpanAreaId = $valueTypeId . $firstDateSpanAreaSuffix;
     $secondDateSpanAreaId = $valueTypeId . $secondDateSpanAreaSuffix;
     $valueTypesRequiringFirstDateInput = MixedDateTypesSearchFormAttributeMappingRules::getValueTypesRequiringFirstDateInput();
     $valueTypesRequiringSecondDateInput = MixedDateTypesSearchFormAttributeMappingRules::getValueTypesRequiringSecondDateInput();
     Yii::app()->clientScript->registerScript('mixedDateTypes', "\n                \$('.dateValueType').change( function()\n                    {\n                        arr  = " . CJSON::encode($valueTypesRequiringFirstDateInput) . ";\n                        arr2 = " . CJSON::encode($valueTypesRequiringSecondDateInput) . ";\n                        firstDateSpanAreaQualifier = '#' + \$(this).attr('id') + '" . $firstDateSpanAreaSuffix . "';\n                        secondDateSpanAreaQualifier = '#' + \$(this).attr('id') + '" . $secondDateSpanAreaSuffix . "';\n                        if (\$.inArray(\$(this).val(), arr) != -1)\n                        {\n                            \$(firstDateSpanAreaQualifier).show();\n                            \$(firstDateSpanAreaQualifier).find('.hasDatepicker').prop('disabled', false);\n                        }\n                        else\n                        {\n                            \$(firstDateSpanAreaQualifier).hide();\n                            \$(firstDateSpanAreaQualifier).find('.hasDatepicker').prop('disabled', true);\n                        }\n                        if (\$.inArray(\$(this).val(), arr2) != -1)\n                        {\n                            \$(secondDateSpanAreaQualifier).show();\n                            \$(secondDateSpanAreaQualifier).find('.hasDatepicker').prop('disabled', false);\n                        }\n                        else\n                        {\n                            \$(secondDateSpanAreaQualifier).hide();\n                            \$(secondDateSpanAreaQualifier).find('.hasDatepicker').prop('disabled', true);\n                        }\n                    }\n                );\n            ");
     $startingDivStyleFirstDate = null;
     $startingDivStyleSecondDate = null;
     if (!in_array($this->getValueType(), $valueTypesRequiringFirstDateInput)) {
         $startingDivStyleFirstDate = "display:none;";
         $firstDateDisabled = 'disabled';
     } else {
         $firstDateDisabled = null;
     }
     if (!in_array($this->getValueType(), $valueTypesRequiringSecondDateInput)) {
         $startingDivStyleSecondDate = "display:none;";
         $secondDateDisabled = 'disabled';
     } else {
         $secondDateDisabled = null;
     }
     $content = ZurmoHtml::tag('span', array('id' => $firstDateSpanAreaId, 'class' => 'first-date-area', 'style' => $startingDivStyleFirstDate), $this->renderEditableFirstDateContent($firstDateDisabled));
     $content .= ZurmoHtml::tag('span', array('id' => $secondDateSpanAreaId, 'class' => 'second-date-area', 'style' => $startingDivStyleSecondDate), ZurmoHtml::Tag('span', array('class' => 'dynamic-and-for-mixed'), Zurmo::t('Core', 'and')) . $this->renderEditableSecondDateContent($secondDateDisabled));
     return $content;
 }
 /**
  * Render a date JUI widget
  * @return The element's content as a string.
  */
 protected function renderControlEditable()
 {
     $valueTypeid = $this->getEditableInputId($this->attribute, 'type');
     $valueFirstDateId = $this->getEditableInputId($this->attribute, 'firstDate');
     $firstDateSpanAreaId = $valueTypeid . '-first-date-area';
     $valueSecondDateId = $this->getEditableInputId($this->attribute, 'secondDate');
     $secondDateSpanAreaId = $valueTypeid . '-second-date-area';
     $valueTypesRequiringFirstDateInput = MixedDateTypesSearchFormAttributeMappingRules::getValueTypesRequiringFirstDateInput();
     $valueTypesRequiringSecondDateInput = MixedDateTypesSearchFormAttributeMappingRules::getValueTypesRequiringSecondDateInput();
     Yii::app()->clientScript->registerScript('mixedDateTypesForSearch' . $valueTypeid, "\n                \$('#{$valueTypeid}').change( function()\n                    {\n                        arr  = " . CJSON::encode($valueTypesRequiringFirstDateInput) . ";\n                        arr2 = " . CJSON::encode($valueTypesRequiringSecondDateInput) . ";\n                        if (\$.inArray(\$(this).val(), arr) != -1)\n                        {\n                               \$('#{$firstDateSpanAreaId}').show();\n                            \$('#{$valueFirstDateId}').prop('disabled', false);\n                        }\n                        else\n                        {\n                            \$('#{$firstDateSpanAreaId}').hide();\n                            \$('#{$valueFirstDateId}').prop('disabled', true);\n                        }\n                        if (\$.inArray(\$(this).val(), arr2) != -1)\n                        {\n                            \$('#{$secondDateSpanAreaId}').show();\n                            \$('#{$valueSecondDateId}').prop('disabled', false);\n                        }\n                        else\n                        {\n                            \$('#{$secondDateSpanAreaId}').hide();\n                            \$('#{$valueSecondDateId}').prop('disabled', true);\n                        }\n                    }\n                );\n            ");
     $startingDivStyleFirstDate = null;
     $startingDivStyleSecondDate = null;
     $valueType = ArrayUtil::getArrayValue($this->model->{$this->attribute}, 'type');
     if (!in_array($valueType, $valueTypesRequiringFirstDateInput)) {
         $startingDivStyleFirstDate = "style='display:none;'";
     }
     if (!in_array($valueType, $valueTypesRequiringSecondDateInput)) {
         $startingDivStyleSecondDate = "style='display:none;'";
     }
     $content = $this->renderEditableValueTypeContent();
     $content .= '<span id="' . $firstDateSpanAreaId . '" ' . $startingDivStyleFirstDate . '>';
     $content .= '&#160;' . $this->renderEditableFirstDateContent();
     $content .= '</span>';
     $content .= '<span id="' . $secondDateSpanAreaId . '" ' . $startingDivStyleSecondDate . '>';
     $content .= '&#160;' . Yii::t('Default', 'and') . $this->renderEditableSecondDateContent();
     $content .= '</span>';
     return $content;
 }
 public function testGetMetadataForDynamicDateTimeAttribute()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $searchForm = new ASearchFormTestModel(new MixedRelationsModel());
     //Make sure the timeZone is different than UTC for testing.
     Yii::app()->user->userModel->timeZone = 'America/Chicago';
     //TEST when no value present
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', null);
     $compareData = array(array('dateTime' => array('value' => null)));
     $this->assertEquals($compareData, $metadata);
     //Test Date = Today
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_TODAY;
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $todayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $today = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $todayDateTime->getTimeStamp());
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today), 'operatorType' => 'greaterThanOrEqualTo', 'appendStructureAsAnd' => true)), array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today), 'operatorType' => 'lessThanOrEqualTo', 'appendStructureAsAnd' => true)));
     $this->assertEquals($compareData, $metadata);
     //Test Date = Tomorrow
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_TOMORROW;
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $tomorrowDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $tomorrow = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $tomorrowDateTime->getTimeStamp() + 60 * 60 * 24);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($tomorrow), 'operatorType' => 'greaterThanOrEqualTo', 'appendStructureAsAnd' => true)), array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($tomorrow), 'operatorType' => 'lessThanOrEqualTo', 'appendStructureAsAnd' => true)));
     $this->assertEquals($compareData, $metadata);
     //Test Date = Yesterday
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_YESTERDAY;
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $yesterdayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $yesterday = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $yesterdayDateTime->getTimeStamp() - 60 * 60 * 24);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($yesterday), 'operatorType' => 'greaterThanOrEqualTo', 'appendStructureAsAnd' => true)), array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($yesterday), 'operatorType' => 'lessThanOrEqualTo', 'appendStructureAsAnd' => true)));
     $this->assertEquals($compareData, $metadata);
     //Test Date = After X
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_AFTER;
     $value['firstDate'] = '2011-05-05';
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay('2011-05-05'), 'operatorType' => 'greaterThanOrEqualTo')));
     $this->assertEquals($compareData, $metadata);
     //Test Date = Before X
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_BEFORE;
     $value['firstDate'] = '2011-05-04';
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay('2011-05-04'), 'operatorType' => 'lessThanOrEqualTo')));
     $this->assertEquals($compareData, $metadata);
     //Test Date next 7 days
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_NEXT_7_DAYS;
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $todayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $today = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $todayDateTime->getTimeStamp());
     $todayPlus7Days = MixedDateTypesSearchFormAttributeMappingRules::calculateNewDateByDaysFromNow(7);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today), 'operatorType' => 'greaterThanOrEqualTo', 'appendStructureAsAnd' => true)), array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($todayPlus7Days), 'operatorType' => 'lessThanOrEqualTo', 'appendStructureAsAnd' => true)));
     $this->assertEquals($compareData, $metadata);
     //Test Date last 7 days
     $value = array();
     $value['type'] = MixedDateTypesSearchFormAttributeMappingRules::TYPE_LAST_7_DAYS;
     $metadata = SearchFormAttributesToSearchDataProviderMetadataUtil::getMetadata($searchForm, 'dateTime__DateTime', $value);
     $todayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $today = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $todayDateTime->getTimeStamp());
     $todayMinus7Days = MixedDateTypesSearchFormAttributeMappingRules::calculateNewDateByDaysFromNow(-7);
     $compareData = array(array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($todayMinus7Days), 'operatorType' => 'greaterThanOrEqualTo', 'appendStructureAsAnd' => true)), array('dateTime' => array('value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today), 'operatorType' => 'lessThanOrEqualTo', 'appendStructureAsAnd' => true)));
     $this->assertEquals($compareData, $metadata);
 }
 /**
  * @return array
  */
 protected static function getValueTypesWhereSecondValueIsRequired()
 {
     return MixedDateTypesSearchFormAttributeMappingRules::getValueTypesWhereSecondValueIsRequired();
 }
 public function testSearchFormDynamicAttributes()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $searchAttributes = array('aaaMember' => 'Vomitorio Corp', 'bbb' => array('relatedData' => true, 'ccc' => array('relatedData' => true, 'date__Date' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_AFTER, 'firstDate' => '1991-03-04'), 'dateTime__DateTime' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_TODAY), 'dateTime2__DateTime' => array('value' => null), 'eee' => array('relatedData' => true, 'eeeMember' => 'eeeMemberValue'), 'iii' => array('relatedData' => true, 'date__Date' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_AFTER, 'firstDate' => '1991-03-04'), 'dateTime__DateTime' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_TODAY), 'dateTime2__DateTime' => array('value' => null)))));
     $metadataAdapter = new SearchDataProviderMetadataAdapter(new AAA(false), 1, $searchAttributes);
     $todayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $today = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $todayDateTime->getTimeStamp());
     $todayPlus7Days = MixedDateTypesSearchFormAttributeMappingRules::calculateNewDateByDaysFromNow(7);
     $metadata = $metadataAdapter->getAdaptedMetadata();
     $compareClauses = array(1 => array('attributeName' => 'aaaMember', 'operatorType' => 'startsWith', 'value' => 'Vomitorio Corp'), 2 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'date', 'operatorType' => 'greaterThanOrEqualTo', 'value' => '1991-03-04'))), 3 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'dateTime', 'operatorType' => 'greaterThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today)))), 4 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'dateTime', 'operatorType' => 'lessThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today)))), 5 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'eee', 'relatedModelData' => array('attributeName' => 'eeeMember', 'operatorType' => 'startsWith', 'value' => 'eeeMemberValue')))), 6 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'iii', 'relatedModelData' => array('attributeName' => 'date', 'operatorType' => 'greaterThanOrEqualTo', 'value' => '1991-03-04')))), 7 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'iii', 'relatedModelData' => array('attributeName' => 'dateTime', 'operatorType' => 'greaterThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today))))), 8 => array('attributeName' => 'bbb', 'relatedModelData' => array('attributeName' => 'ccc', 'relatedModelData' => array('attributeName' => 'iii', 'relatedModelData' => array('attributeName' => 'dateTime', 'operatorType' => 'lessThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today))))));
     $compareStructure = '1 and (2) and (3 and 4) and 5 and (6) and (7 and 8)';
     $this->assertEquals($compareClauses, $metadata['clauses']);
     $this->assertEquals($compareStructure, $metadata['structure']);
 }
 public function testSearchFormDynamicAttributes()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $searchAttributes = array('date__Date' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_AFTER, 'firstDate' => '1991-03-04'), 'dateTime__DateTime' => array('type' => MixedDateTypesSearchFormAttributeMappingRules::TYPE_TODAY), 'dateTime2__DateTime' => array('value' => null));
     $searchForm = new MixedRelationsModelSearchFormTestModel(new MixedRelationsModel());
     $metadataAdapter = new SearchDataProviderMetadataAdapter($searchForm, $super->id, $searchAttributes);
     $todayDateTime = new DateTime(null, new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser()));
     $today = Yii::app()->dateFormatter->format(DatabaseCompatibilityUtil::getDateFormat(), $todayDateTime->getTimeStamp());
     $todayPlus7Days = MixedDateTypesSearchFormAttributeMappingRules::calculateNewDateByDaysFromNow(7);
     $metadata = $metadataAdapter->getAdaptedMetadata();
     $compareClauses = array(1 => array('attributeName' => 'date', 'operatorType' => 'greaterThanOrEqualTo', 'value' => '1991-03-04'), 2 => array('attributeName' => 'dateTime', 'operatorType' => 'greaterThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today)), 3 => array('attributeName' => 'dateTime', 'operatorType' => 'lessThanOrEqualTo', 'value' => DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today)));
     $compareStructure = '(1) and (2 and 3)';
     $this->assertEquals($compareClauses, $metadata['clauses']);
     $this->assertEquals($compareStructure, $metadata['structure']);
 }