protected function getChildCategoryOptions($parentCatId)
 {
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $query->select('title, id, published, parent_id');
     $query->from('#__judirectory_categories');
     $query->where('parent_id = ' . (int) $parentCatId);
     $query->order('lft');
     $db->setQuery($query);
     $categoryObjectList = $db->loadObjectList();
     foreach ($categoryObjectList as $key => $cat) {
         $canSubmitListing = JUDirectoryFrontHelperPermission::canSubmitListing($cat->id);
         // Unset category that user can not submit listing
         if (!$canSubmitListing) {
             unset($categoryObjectList[$key]);
             continue;
         }
         // Unpublished category wrap by []
         if ($cat->published != 1) {
             $categoryObjectList[$key]->title = "[" . $cat->title . "]";
         }
     }
     $rootCat = JUDirectoryFrontHelperCategory::getRootCategory();
     // getParams by cat_id if possible
     if (isset($this->listing) && $this->listing->cat_id) {
         $params = JUDirectoryHelper::getParams($this->listing->cat_id);
     } else {
         $params = JUDirectoryHelper::getParams(null, $this->listing_id);
     }
     if ($parentCatId != 0 && ($parentCatId != $rootCat->id || $parentCatId == $rootCat->id && $params->get('allow_add_listing_to_root', 0))) {
         $catParent = JUDirectoryHelper::getCategoryByID($parentCatId);
         array_unshift($categoryObjectList, JHtml::_('select.option', $catParent->parent_id, JText::_('COM_JUDIRECTORY_BACK_TO_PARENT_CATEGORY'), 'id', 'title'));
     }
     return $categoryObjectList;
 }
 public function moveCats($cat_id_arr, $tocat_id, $move_option_arr)
 {
     $tocat_id = (int) $tocat_id;
     $cat_id_arr = (array) $cat_id_arr;
     if (empty($cat_id_arr)) {
         JError::raiseWarning(100, JText::_('COM_JUDIRECTORY_NO_SOURCE_CATEGORY_SELECTED'));
         return false;
     }
     if (empty($tocat_id)) {
         JError::raiseWarning(100, JText::_('COM_JUDIRECTORY_NO_TARGET_CATEGORY_SELECTED'));
         return false;
     }
     $user = JFactory::getUser();
     $table = $this->getTable();
     if (!$table->load($tocat_id)) {
         JError::raiseWarning(500, JText::_('COM_JUDIRECTORY_TARGET_CATEGORY_NOT_FOUND'));
         return false;
     }
     $assetName = 'com_judirectory.category.' . (int) $tocat_id;
     $candoCreate = $user->authorise('judir.category.create', $assetName);
     if (!$candoCreate) {
         JError::raiseError(100, JText::sprintf('COM_JUDIRECTORY_CAN_NOT_CREATE_CATEGORY_IN_CATEGORY_X', $table->title));
         return false;
     }
     set_time_limit(0);
     $total_moved_categories = 0;
     foreach ($cat_id_arr as $cat_id) {
         if (!$table->load($cat_id, true)) {
             continue;
         }
         $assetName = 'com_judirectory.category.' . (int) $cat_id;
         $candoEdit = $user->authorise('judir.category.edit', $assetName);
         if (!$candoEdit) {
             JError::raiseWarning(100, JText::_('COM_JUDIRECTORY_YOU_DONT_HAVE_PERMISSION_TO_EDIT_CAT'));
             continue;
         }
         if ($this->isChildCategory($cat_id, $tocat_id) || $tocat_id == $table->parent_id) {
             continue;
         }
         $table->setLocation($tocat_id, 'last-child');
         if (in_array('keep_extra_fields', $move_option_arr)) {
             if ($table->selected_fieldgroup == -1) {
                 $tocat_obj = JUDirectoryHelper::getCategoryByID($tocat_id);
                 if ($table->fieldgroup_id != $tocat_obj->fieldgroup_id) {
                     $table->selected_fieldgroup = $table->fieldgroup_id;
                 }
             }
         } else {
             if ($table->fieldgroup_id != 0) {
                 JUDirectoryHelper::changeInheritedFieldGroupId($table->id, 0);
                 $query = "DELETE FROM #__judirectory_fields_ordering WHERE `item_id` = " . $table->id . " AND `type` = 'category'";
                 $db = JFactory::getDbo();
                 $db->setQuery($query);
                 $db->execute();
             }
             $table->selected_fieldgroup = $table->fieldgroup_id = 0;
         }
         if (in_array('keep_rates', $move_option_arr)) {
             if ($table->selected_criteriagroup == -1) {
                 $tocat_obj = JUDirectoryHelper::getCategoryByID($tocat_id);
                 if ($table->criteriagroup_id != $tocat_obj->criteriagroup_id) {
                     $table->selected_criteriagroup = $table->criteriagroup_id;
                 }
             }
         } else {
             $table->selected_criteriagroup = $table->criteriagroup_id = 0;
             JUDirectoryHelper::changeInheritedCriteriagroupId($table->id, $table->criteriagroup_id);
         }
         if ($table->style_id == -1) {
             if ($table->parent_id != $tocat_id) {
                 $oldTemplateStyleObject = JUDirectoryFrontHelperTemplate::getTemplateStyleOfCategory($table->id);
                 $newTemplateStyleObject = JUDirectoryFrontHelperTemplate::getTemplateStyleOfCategory($tocat_id);
                 if ($oldTemplateStyleObject->template_id != $newTemplateStyleObject->template_id) {
                     if (in_array('keep_template_params', $move_option_arr)) {
                         $table->style_id = $oldTemplateStyleObject->id;
                     } else {
                         $table->template_params = '';
                         JUDirectoryFrontHelperTemplate::removeTemplateParamsOfInheritedStyleCatListing($table->id);
                     }
                 }
             }
         }
         if ($table->store()) {
             $total_moved_categories++;
         }
     }
     return $total_moved_categories;
 }
    protected function getInput()
    {
        $document = JFactory::getDocument();
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('cat_id_related');
        $query->from('#__judirectory_categories_relations');
        $query->where('cat_id = ' . (int) $this->form->getValue('id'));
        $query->order("ordering ASC");
        $db->setQuery($query);
        $relcategories = $db->loadColumn();
        $script = '
		jQuery(document).ready(function($){
			$(".category_list").dragsort({ dragSelector: "li", dragEnd: saveOrder, placeHolderTemplate: "<li class=\'placeHolder\'></li>", dragSelectorExclude: "input, textarea, span, a.removeitem"});

            function saveOrder() {
                var data = $("#gallery li").map(function() { return $(this).data("itemid"); }).get();
            };

			$(".category_list").on("click","a.removeitem", function(event){
				event.preventDefault();
				$(this).closest("li").remove();
			});

			$(".browse_cat").bind("dblclick",function(){
				var id = $(this).find("option:selected").val();
				$.ajax({
			  		type: "POST",
			  		url:"index.php?option=com_judirectory&task=categories.loadcategories",
			  		data: {id : id, type : "category"}
				}).done(function(data){
					data = $.parseJSON(data);
					$(".browse_cat").html(data.html);
					$(".active_pathway").html(data.path);
				});
			});

			$(".change_categories").click(function(){
				$(".category_selection").slideToggle(400);
			});

			$("#add_related_categories").click(function(event){
    			event.preventDefault();
    			var has_element = [];
				var current_cat = ' . JFactory::getApplication()->input->get('id', 0) . ';
				$.each( $("option:selected",".browse_cat"), function(key, value ) {
					if($(this).data("noselect")){
						return;
					}

					var selectedValue = $(this).val();
					var selectedText = $(this).text();

  					if(current_cat == selectedValue){
						alert("' . JText::_('COM_JUDIRECTORY_CAN_NOT_ADD_CATEGORY_ITSELF_AS_RELATED_CATEGORY') . '");
						return;
					}
  					if($(".category_list > li[id=\'category-"+selectedValue+"\']").length <= 0){
  						var path = $(".active_pathway").text() + " > " + selectedText;
  						$("<li id=\\"category-"+selectedValue+"\\"><a class=\\"drag-icon\\"></a><span>"+path+"</span><input type=\\"hidden\\" name=\\"relcategories[]\\" value=\\""+selectedValue+"\\" /> <a href=\\"#\\" class=\\"removeitem\\" ><i class=\\"icon-minus\\"></i> ' . JText::_('COM_JUDIRECTORY_REMOVE') . '</a></li>").appendTo(".category_list");
   					}else{
  						has_element.push(selectedText);
  					}
				});

                if(has_element.length == 1){
                    alert("' . JText::_('COM_JUDIRECTORY_CATEGORY_X_ALREADY_EXISTED') . '".replace("%s", has_element[0]));
				}else if(has_element.length > 1){
				    alert("' . JText::_('COM_JUDIRECTORY_CATEGORIES_X_ALREADY_EXISTED') . '".replace("%s", has_element.join(", ")));
				}
				return false;
			});
		});';
        $document->addScriptDeclaration($script);
        $html = "";
        $html .= "<div class=\"categories\">";
        $html .= "<ul class=\"category_list nav clearfix\">";
        if ($relcategories) {
            foreach ($relcategories as $key => $relcategory) {
                $path = JUDirectoryHelper::generateCategoryPath($relcategory);
                $html .= '<li id="category-' . $relcategory . '">';
                $html .= '<a class="drag-icon"></a>';
                $html .= '<span>' . $path . '</span>';
                $html .= '<input type="hidden" name="relcategories[]" value="' . $relcategory . '" />';
                $html .= '<a class="removeitem" href="#"><i class="icon-minus"></i> ' . JText::_('COM_JUDIRECTORY_REMOVE') . '</a>';
                $html .= "</li>";
            }
        }
        $html .= '</ul>';
        $catId = $this->form->getValue('id', 0);
        $catParentId = !$catId ? JUDirectoryFrontHelperCategory::getRootCategory()->id : JUDirectoryHelper::getCategoryByID($catId)->parent_id;
        $query = $db->getQuery(true);
        $query->SELECT('title, id, published, parent_id');
        $query->FROM('#__judirectory_categories');
        $query->WHERE('parent_id = ' . $catParentId);
        $query->ORDER('lft');
        $db->setQuery($query);
        $categoryList = $db->loadObjectList();
        foreach ($categoryList as $key => $cat) {
            if ($cat->published != 1) {
                $cat->title = "[" . $cat->title . "]";
            }
        }
        if ($catParentId != 0) {
            $catParent = JUDirectoryHelper::getCategoryByID($catParentId);
            array_unshift($categoryList, JHtml::_('select.option', $catParent->parent_id, JText::_('COM_JUDIRECTORY_BACK_TO_PARENT_CATEGORY'), 'id', 'title'));
        }
        $html .= "<a href='#' class='change_categories' onclick='return false;'><i class=\"icon-folder\"></i> " . JText::_('COM_JUDIRECTORY_ADD_RELATED_CATEGORIES') . "</a>";
        $html .= '<div class="category_selection" style="display: none;">';
        $html .= '<div class="active_pathway">' . JUDirectoryHelper::generateCategoryPath($catParentId, 'li') . '</div>';
        $html .= JHtml::_('select.genericlist', $categoryList, 'browse_cat', 'class="inputbox browse_cat" multiple="multiple" size="8"', 'id', 'title', '', "");
        $html .= '<div class="cat_action clearfix">';
        $html .= "<button id='add_related_categories' class='btn btn-mini btn-primary'>" . JText::_('COM_JUDIRECTORY_ADD_RELATED_CATEGORIES') . "</button>";
        $html .= "<input type='hidden' name='cat_id_related' id='cat_id_related' value='" . $this->value . "' />";
        $html .= "</div>";
        $html .= "</div>";
        $html .= '</div>';
        return $html;
    }