var panelNavContexts = ["department","category","product","content-20","content-22"];

var panelNavOne = function(){
  var $panelNav = $("ul#panel-navigation"),
    $items = $panelNav.find("li").detach(),
    $groupItems = $items.filter("[data-groupname]"),
    $deptItems = $items.filter(".nav-department"),
    $catItems = $items.filter(".nav-category"),
    activeGroupName = "",
    groupMemberIds = {},
    $groupMembers = {},
    destDept = {},
    activeDeptId = (function(){
      return (arrSelectedNavAttr.department) ? parseFloat(arrSelectedNavAttr.department.id, 10) : -1;
    }()),
    activeCatId = (function(){
      return (arrSelectedNavAttr.category) ? parseFloat(arrSelectedNavAttr.category.id, 10) : -1;
    }());
  
  //populate GroupMemberIds & $groupMembers obj
  $groupItems.each(function(){
    var $thisGroup = $(this),
      groupName = $thisGroup.data("groupname"),
      grouppageid = $thisGroup.data("grouppageid"),
      groupDeptsAry = $thisGroup.data("group-depts");

    if(grouppageid === CNST.PAGEID) {
      activeGroupName = groupName;
    }
    groupMemberIds[groupName] = {};
    groupMemberIds[groupName] = groupDeptsAry;
    $groupMembers[groupName] = $();
  });

  //create $collections for destination departments
  //set "activate" appropriate category
  $catItems.each(function(index){
    var $thisCat = $(this),
		$childA = $thisCat.children("a"),
      catId = $thisCat.data("catid"),
      parentId = $thisCat.data("parentdeptid");      
      if (catId === activeCatId) {
          $thisCat.addClass("active");
		  if(typeof breadcrumbs !== undefined){
			breadcrumbs.category = {};
			breadcrumbs.category.link = $childA.attr("href");
			breadcrumbs.category.text = $childA.text();
			breadcrumbs.category.id = catId;
		  }
      }
    if(!destDept[parentId]){
      destDept[parentId] = [$thisCat];
    } else {
      destDept[parentId].push($thisCat);
    }
  });

  $deptItems.each(function(index){
    var $thisDept = $(this),
      deptId = $thisDept.data("deptid"),
	  $childA = $thisDept.children("a"),
      $catUl,
      active = false,
      i,length;

      if (deptId === activeDeptId) {
          $thisDept.addClass("active");
          active = true;

		  if(typeof breadcrumbs !== undefined){
			breadcrumbs.department = {};
			breadcrumbs.department.link = $childA.attr("href");
			breadcrumbs.department.text = $.trim($childA.text());
			breadcrumbs.department.id = deptId;
		  }
      }
    
    if(destDept[deptId]){
      $catUl = $("<ul class='categories'></ul>");
      length = destDept[deptId].length;
      for(i = 0; i <= length; i = i + 1) {
        $catUl.append(destDept[deptId][i]);
      }
      $catUl.appendTo($thisDept);
    }
	

	//add $thisDept to groupName (jQuery collection)
    $.each(groupMemberIds, function(groupName, deptArray){

      if($.inArray(deptId, deptArray) !== -1){	//if thisDept's id is in the groupArray add it.
        $groupMembers[groupName] = $groupMembers[groupName].add($thisDept);
		
        if (active) {	//if this dept is active set activeGroupName to this groupName
          	activeGroupName = groupName;
        }
      }
    });
	
	$("#group-mode-heading").text(activeGroupName);
	Cufon.replace("#group-mode-heading");
  });
  
  $.each($groupMembers, function(groupName, $collection){
    var $thisGroup = $groupItems.filter("[data-groupname=" + groupName + "]"),
		$childA = $thisGroup.children("a");

    $("<ul class='departments'></ul>").append($collection).appendTo($thisGroup);
    if(groupName === activeGroupName){
      $thisGroup.addClass("open");
		  if(typeof breadcrumbs !== undefined){
			breadcrumbs.group = {};
			$("body").addClass("group-" + groupName);
			breadcrumbs.group.link = $childA.attr("href");
			breadcrumbs.group.text = $childA.text();
			breadcrumbs.group.id = groupName;
		  }
    }
    $thisGroup.appendTo($panelNav);
  });
};

var panelNav = {
		$parent : null,
		settings : {
			parent	: "#panel-navigation",
			renderActiveOnly : true,
			showlog		: true,
			showIds		: false,
			breadcrumbs : true
		},
		$items			: null,
		$groupItems		: null,
		dedicatedDepts	: [],
		groupLength		: 0,
		groupObj		: {},
		$deptItems		: null,
		$deptObj		: {},
		activeGroupName : "",
		$catItems		: null,
		$subCatItems	: null,
		groupMemberIds	: {},
		$groupMembers	: {},
		destDept		: {},
		destCat			: {},
		errorLog		: [],
		activeDeptId	: (function(){
				return (arrSelectedNavAttr.department) ? parseFloat(arrSelectedNavAttr.department.id, 10) : -1; //need number for comparison
			}()),
		activeCatId		: (function(){
				return (arrSelectedNavAttr.category) ? parseFloat(arrSelectedNavAttr.category.id, 10) : -1;
			}()),
		activeSubCatId	: (function(){
				return (arrSelectedNavAttr.subcategory) ? parseFloat(arrSelectedNavAttr.subcategory.id, 10) : -1;
			}()),
		construct : function(){
			var app = panelNav;
			app.$parent = $(app.settings.parent);
			app.$items = app.$parent.find("li");
			app.$groupItems = app.$items.filter(".dept-group");
			app.groupLength = app.$groupItems.length;
			app.$deptItems = app.$items.filter(".nav-department, .nav-dept");
			app.$catItems = app.$items.filter(".nav-category, .nav-cat");
			app.$subCatItems = app.$items.filter(".nav-subcategory, .nav-subcat");
		},
		breadcrumb : function($obj, level){
			var breadcrumbs,
				$this = $obj,
				$a = $this.find("a"),
				href = $a.attr("href"),
				name = $this.data("name");
				
			if(!window.breadcrumbs) {
				window.breadcrumbs = {};
				console.log("created breadcrumbs");
			}
			breadcrumbs = window.breadcrumbs;
			breadcrumbs[level] = {};
			breadcrumbs[level].link = href;
			breadcrumbs[level].text = name;
			switch (level) {
				case "department" :
					breadcrumbs[level].id = $this.data("deptid");
					break;
				case "category" :
					breadcrumbs[level].id = $this.data("catid");
					break;
				case "subcategory" :
					breadcrumbs[level].id = $this.data("subcatid");
					break;
				case "group" :
					breadcrumbs[level].id = $this.data("groupname");
					breadcrumbs[level].text = $this.data("groupname");
					break;
				default:
					break;
			}
			
		},
		logError : function(message, type){
				var messObj = {};
					messObj.message = message;
					messObj.type = type || "default";
				switch (type) {
					case "error":
						messObj.type = "error";
						break;
					case "default":
						messObj.type = "default";
						break;
					default:
						break;
				}
				panelNav.errorLog.push(messObj);
			},
		groupItems : function(){
			var app = panelNav;
			//populate groupObj with name and dept array
			panelNav.$groupItems.each(function(){
				var $thisGroup = $(this),
					name = $thisGroup.data("groupname"),
					lGroupObj = app.groupObj[name] = {};
				lGroupObj.depts = $thisGroup.data("group-depts");
				if($.inArray(app.activeDeptId,lGroupObj.depts) !== -1){
					$thisGroup.addClass("open");
					if (app.settings.breadcrumbs) {
						app.breadcrumb($thisGroup, "group");
					}
				}
				app.dedicatedDepts = app.dedicatedDepts.concat([],lGroupObj.depts);
				lGroupObj.element = $thisGroup;
			});
		},
		setDeptItems : function(){
			var app = panelNav;
			app.$deptItems.each(function(index){
				var $thisDept = $(this),
					deptId = $thisDept.data("deptid"),
					$catItems = app.getCatItems(deptId),
					$thisDeptObj;
					
					
				if (app.settings.showIds) { $thisDept.prepend("<small>" + deptId + "</small>");	}
				if($catItems){ $thisDept.append($catItems); }
				
				$thisDeptObj = app.$deptObj[deptId] = {};
				$thisDeptObj.element = $thisDept;
				$thisDeptObj.active = false;
				//check if deptId is not dedicated to a group
				if($.inArray(deptId, app.dedicatedDepts) === -1){
					app.logError("dept " + deptId + " has is not in a group :-(", "error");
				}
				
				if (deptId === app.activeDeptId) {
					$thisDeptObj.element = $thisDept.addClass("active");
					$thisDeptObj.active = true;
					if (app.settings.breadcrumbs) {
						app.breadcrumb($thisDept, "department");
					}
					app.setActiveGroupName(deptId);
				}
			});//End $deptItems
		},
		setActiveGroupName : function(activeDeptId){
			var app = panelNav,
				lGroupObj = app.groupObj,
				group;
			for (group in lGroupObj) {
				if (lGroupObj.hasOwnProperty(group)) {
					if($.inArray(activeDeptId, lGroupObj[group].depts) !== -1) {
						app.activeGroupName = group;
					}
				}
			}
			$("body").addClass("group-" + app.activeGroupName);
		},
		getCatItems : function(deptId){
			var app = panelNav,
				$deptCats = app.$catItems.filter("[data-parentdeptid="+deptId+"]"),
				$ul = $("<ul class='subcategories'></ul>");
			$deptCats.each(function(index){
				var $thisCat = $(this),
					catId = $thisCat.data("catid"),
					$subCats = app.getSubCatItems(catId);
				if (app.settings.showIds) { $thisCat.prepend("<small>" + catId + "</small>"); }
				if($subCats){
					$subCats.appendTo($thisCat);
				}
				if (catId === app.activeCatId) {	//set "activate" appropriate category
					$thisCat.addClass("active");
					if (app.settings.breadcrumbs) {
						app.breadcrumb($thisCat, "category");
					}
				}
				$ul.append($thisCat);
			});//end $catItems
			return $ul;
		},
		getSubCatItems : function(catId){
			var app = panelNav,
				$catSubCats = app.$subCatItems.filter("[data-parentcatid=" + catId + "]"),
				$ul = $("<ul class='subcategories'></ul>");
			$catSubCats.each(function(){
				var $thisSubCat = $(this),
					subCatId = $thisSubCat.data("subcatid");
				if (subCatId === app.activeSubCatId) { //set "activate" appropriate category
					$thisSubCat.addClass("active");
					if (app.settings.breadcrumbs) {
						app.breadcrumb($thisSubCat, "subcategory");
					}
				}
				$thisSubCat.appendTo($ul);
			});//end $subCatItems
			return $ul;
		},
		buildGroup : function(obj){
			var app = panelNav,
				groupDepts = obj.depts,
				deptId,
				$deptEl,
				lDeptObj = app.$deptObj,
				$groupElement = obj.element,
				$ul = $("<ul></ul>"),
				length = groupDepts.length,i;
			
			for(i = 0; i < length; i = i + 1){
				deptId = groupDepts[i];
				if(lDeptObj[deptId]){
					$deptEl = lDeptObj[deptId].element;
				} else {
					app.logError("dept " + deptId + " is not a valid department","error");
				}
				$ul.append($deptEl);
			}
			
			$groupElement.append($ul).appendTo(app.$parent);
		},
		iterateGroups : function(){
			var app = panelNav;
			if(panelNav.settings.renderActiveOnly){
				app.buildGroup(app.groupObj[app.activeGroupName]);
			} else {
				$.each(app.groupObj, function(groupName){
					app.buildGroup(app.groupObj[groupName]);
				});
			}
			
		},
		insertLog : function(){
			var app = panelNav;
			if(app.errorLog.length > 0 && app.settings.showlog){
				$.each(app.errorLog, function(){
					var message = this.message,
						type = this.type,
						$li = $("<li></li>").text(message);
					switch (type){
						case "error" :
							$li.css({"background-color":"red","color":"#fff"});
							break;
						default:
							break;
					}
					app.$parent.append($li);
				});
			}
		},
		init : function(){
			console.time("panelNav");
			var app = panelNav;
			app.construct();
			app.groupItems();
			app.setDeptItems();
			app.iterateGroups();
			app.insertLog();
			console.timeEnd("panelNav");
		}
};


if($.inArray(CNST.PAGEID, panelNavContexts) !== -1){
	$("#panel-navigation").removeClass("default-mode").addClass("group-mode");
//	panelNavOne();
	panelNav.init();
	$("#group-mode-heading").text(panelNav.activeGroupName);
	Cufon.replace("#group-mode-heading");
} else {
	// $("#group-mode-heading").remove();
	$("#panel-navigation li").not(".default").hide();
}
