/* License info will be placed here by Build */

/* Include in Pro */

if (typeof get != 'function') {
	//Shortcut to document.getElementById
	function get(x) {
		return document.getElementById(x);
	}
}

//Shortcut to document.createElement
function create(el) {
	return document.createElement(el);
}

var currentHighestItemId = 0;

function HierarchyEditor(pluginDirectory, phrases) {
	var self = this;
	var container = get('itemEditor');
	var levelContainers = new Array();
	var itemBreadcrumbs = new Array();
	var levelDisplayContainers = new Array();
	var currentLevelHasChilden;
	
	var cutBuffer = undefined;
	var cutElementId = undefined;
	var displayStartAtLevel = 0;

	var levelContainerBackgroundStartColor = [194,216,242];
	var numLevelsOnDisplay = 3;
	
	function getItems( parent_id ) {
		return nonAsyncJSON("../plugins/" + pluginDirectory + "/ajax/get_items.php?parent_id="+parent_id);
	}

	function appendItemLevel(items, level) {
		levelContainers.length = level;
		itemBreadcrumbs.length = level;

		levelContainers[level] = create('div');
		var thisLevelContainer = levelContainers[level];
		thisLevelContainer.className = "item_level_container";
		
		currentLevelHasChilden = false;
		for(key in items) {
			currentLevelHasChilden = true;
			var item = new Item(self, level, items[key]);
			if(items[key]['id'] == cutBuffer)
				item.changeState('cut');
			thisLevelContainer.appendChild(item.getDomElement());
		}

		if(level + 1 > displayStartAtLevel + numLevelsOnDisplay)
		{
			moveViewWindowRight();
		}
		displayItemLevels();
	}

	function displayItemLevels() {
		for(var i=0; i < numLevelsOnDisplay; i++) {
			levelDisplayContainers[i].innerHTML = '';
			if(levelContainers[i] !== undefined && levelContainers[parseInt(i+displayStartAtLevel)] !== undefined) {
				levelDisplayContainers[i].appendChild(levelContainers[parseInt(i+displayStartAtLevel)]);
			}
		}

		if(displayStartAtLevel > 0)
			leftScrollButton.className = "scroll_arrow scroll_arrow_left_on";
		else
			leftScrollButton.className = "scroll_arrow scroll_arrow_left_off";

		if(displayStartAtLevel + numLevelsOnDisplay < levelContainers.length)
			rightScrollButton.className = "scroll_arrow scroll_arrow_right_on";
		else
			rightScrollButton.className = "scroll_arrow scroll_arrow_right_off";

	}

	function moveViewWindowRight() {
		if(levelContainers.length > displayStartAtLevel + numLevelsOnDisplay)
			displayStartAtLevel++;
		displayItemLevels();
	}

	function moveViewWindowLeft() {
		if(parseInt(displayStartAtLevel - 1) >= 0)
			displayStartAtLevel--;
		displayItemLevels();
	}

	this.selectItem = function(item) {
		if (item.isLabel()) {
			return;
		}
		
		if(itemBreadcrumbs[item.getLevel()] !== undefined)
			itemBreadcrumbs[item.getLevel()].changeState('unselected');
		itemBreadcrumbs[item.getLevel()] = item;
		item.changeState('selected');
		appendItemLevel(getItems(item.getId()), item.getLevel() + 1);
		displayBreadcrumbTrail();
		showToolbar();
	};

	this.unselectAllItems = function() {
		itemBreadcrumbs.length = 0;
		appendItemLevel(getItems(0), 0);
		refreshButton.style.display = 'none';
	}

	function displayBreadcrumbTrail() {
		breadcrumbContainer.innerHTML = '';

		for(key in itemBreadcrumbs) {
			if(key > 0)
				breadcrumbContainer.innerHTML += ' -> ';
			breadcrumbContainer.innerHTML += itemBreadcrumbs[key].getTitle();
		}
	}

	function getLevelColor(level) {
		level = (level%2);
		return "rgb("+
			parseInt(levelContainerBackgroundStartColor[0]+(level*20))+","+
			parseInt(levelContainerBackgroundStartColor[1]+(level*20))+","+
			parseInt(levelContainerBackgroundStartColor[2]+(level*30))+")";
	}
	
	function moveItemToTop() {
		var assign_item = itemBreadcrumbs[itemBreadcrumbs.length-1];

		nonAsyncAJAX('../plugins/' + pluginDirectory + '/ajax/paste_item.php?parent_id=0&id='+assign_item.getId());
		
		self.unselectAllItems();
		showToolbar();
	}

	function cutSelectedItem() {
		cutBuffer = itemBreadcrumbs[itemBreadcrumbs.length-1].getId();
		cutElementId = itemBreadcrumbs[itemBreadcrumbs.length-1].getElementId();
		itemBreadcrumbs[itemBreadcrumbs.length-1].changeState('cut');
		showToolbar();
	}

	function pasteCutItem() {
		var cut_id = cutBuffer;
		var insertion_point_item = itemBreadcrumbs[itemBreadcrumbs.length-1];

		for(key in itemBreadcrumbs) {
			if(itemBreadcrumbs[key].getId() == cut_id) {
				alert(phrases['_CANNOT_PASTE_ITEM_AS_ITS_OWN_CHILD']);
				return;
			}
		}
		
		nonAsyncAJAX("../plugins/" + pluginDirectory + "/ajax/paste_item.php?parent_id="+insertion_point_item.getId()+'&id='+cut_id);
		
		if (get(cutElementId)) {
			get(cutElementId).style.display = 'none';
		}

		cutBuffer = undefined;
		self.selectItem(insertion_point_item);
		showToolbar();
	}

	function pasteCutItemChildren() {
		/*
			var cut_id = cutBuffer;
			var insertion_point_item = itemBreadcrumbs[itemBreadcrumbs.length-1];
	
			for(key in itemBreadcrumbs) {
				if(itemBreadcrumbs[key].getId() == cut_id) {
					alert(phrases['_CANNOT_PASTE_ITEM_AS_ITS_OWN_CHILD']);
					return;
				}
			}
	
			nonAsyncAJAX("../plugins/" + pluginDirectory + "/ajax/paste_item_children.php?parent_id="+insertion_point_item.getId()+'&id='+cut_id);
			
			if(itemBreadcrumbs[insertion_point_item.getLevel() - 1] !== undefined) {
				self.selectItem(itemBreadcrumbs[insertion_point_item.getLevel() - 1]);
			}
			else {
				self.unselectAllItems();
			}
			cutBuffer = undefined;
			showToolbar();
		*/
	}

	function assignItemIntoStructure() {
		//Functionally identical to moveItemToTop()
		moveItemToTop();
	}

	function unassignItemFromStructure() {
		var assign_item = itemBreadcrumbs[itemBreadcrumbs.length-1];

		nonAsyncAJAX('../plugins/' + pluginDirectory + '/ajax/paste_item.php?parent_id=NULL&id='+assign_item.getId());
		
		if (itemBreadcrumbs.length == 1) {
			self.unselectAllItems();
		} else {
			self.selectItem(itemBreadcrumbs[assign_item.getLevel() - 1]);
			refreshButton.style.display = 'inherit';
		}
		
		//cutBuffer = undefined;
		showToolbar();
	}

	function refreshPage() {
		self.unselectAllItems();
		showToolbar();
	}

	function showToolbar() {
		topButton.style.display = 'none';
		cutButton.style.display = 'none';
		assignButton.style.display = 'none';
		unassignButton.style.display = 'none';
		pasteItemButton.style.display = 'none';
		disabledUnassignButton.style.display = 'none';

		if(itemBreadcrumbs[0] !== undefined) {
			selectedItem = itemBreadcrumbs[itemBreadcrumbs.length-1];
			
			cutButton.style.display = 'inherit';
			
			if (itemBreadcrumbs.length > 1) {
				topButton.style.display = 'inherit';
			}
			
			if(cutBuffer !== undefined && selectedItem.isAssigned()) {
				pasteItemButton.style.display = 'inherit';
			}
			
			if (selectedItem.isAssigned()) {
				if (currentLevelHasChilden) {
					disabledUnassignButton.style.display = 'inherit';
				} else {
					unassignButton.style.display = 'inherit';
				}
			} else {
				assignButton.style.display = 'inherit';
			}
		}	
	}

	var breadcrumbContainer = get('breadcrumbContainer');

	var topButton = create('a');
	topButton.className = "top_button";
	topButton.title = phrases['_MOVE_ITEM_TO_TOP_OF_STRUCTURE'];
	topButton.onclick = moveItemToTop;

	var cutButton = create('a');
	cutButton.className = "cut_button";
	cutButton.title = phrases['_CUT_SELECTED_ITEM'];
	cutButton.onclick = cutSelectedItem;

	var pasteItemButton = create('a');
	pasteItemButton.className = "paste_item_button";
	pasteItemButton.title = phrases['_PASTE_CUT_ITEM'];
	pasteItemButton.style.display = 'none';
	pasteItemButton.onclick = pasteCutItem;

	var assignButton = create('a');
	assignButton.className = "assign_button";
	assignButton.title = phrases['_ADD_TO_STRUCTURE'];
	assignButton.style.display = 'none';
	assignButton.onclick = assignItemIntoStructure;

	var unassignButton = create('a');
	unassignButton.className = "unassign_button";
	unassignButton.title = phrases['_REMOVE_FROM_STRUCTURE'];
	unassignButton.style.display = 'none';
	unassignButton.onclick = unassignItemFromStructure;

	var disabledUnassignButton = create('a');
	disabledUnassignButton.className = "disabled_unassign_button";
	disabledUnassignButton.title = phrases['_CANT_REMOVE_FROM_STRUCTURE_HAS_CHILDREN'];
	disabledUnassignButton.style.display = 'none';

	var refreshButton = create('a');
	refreshButton.className = "refresh_button";
	refreshButton.title = phrases['_SHOW_ITEMS_RECENTLY_UNASSIGNED'];
	refreshButton.style.display = 'none';
	refreshButton.onclick = refreshPage;

	get('buttonBar').appendChild(refreshButton);
	get('buttonBar').appendChild(assignButton);
	get('buttonBar').appendChild(unassignButton);
	get('buttonBar').appendChild(disabledUnassignButton);
	get('buttonBar').appendChild(pasteItemButton);
	get('buttonBar').appendChild(cutButton);
	get('buttonBar').appendChild(topButton);

	var leftScrollButton = create('a');
	leftScrollButton.href = "";
	leftScrollButton.onclick = function() {moveViewWindowLeft(); return false;};
	leftScrollButton.className = "scroll_arrow scroll_arrow_left_off";
	get('leftScrollContainer').appendChild(leftScrollButton);

	var rightScrollButton = create('a');
	rightScrollButton.href = "";
	rightScrollButton.onclick = function() {moveViewWindowRight(); return false;};
	rightScrollButton.className = "scroll_arrow scroll_arrow_right_off";
	get('rightScrollContainer').appendChild(rightScrollButton);

	var itemViewContanierContainer = create('div');
	var itemViewContanier = create('div');
	itemViewContanier.className = "item_view_container";
	var table = create('table');
	table.className = 'level_viewer';
	var tbody = create('tbody');
	for(var i=0; i<numLevelsOnDisplay; i++) {
		levelDisplayContainers[i] = create('td');
		levelDisplayContainers[i].style.backgroundColor = getLevelColor(i);
		tbody.appendChild(levelDisplayContainers[i]);
	}
	var itemLevelContainer = create('tr');
	table.appendChild(tbody);
	tbody.appendChild(itemLevelContainer);
	itemViewContanier.appendChild(table);
	itemViewContanierContainer.appendChild(itemViewContanier);

	container.appendChild(itemViewContanierContainer);
	showToolbar();
	appendItemLevel(getItems(0), 0);
}

function Item(item_editor, hierachy_level, item) {
	var self = this;
	var container = create('div');
	var elementId = "item" + ++currentHighestItemId;
	container.className = "item";
	container.id = elementId;
	container.onclick = function () { 
		item_editor.selectItem(self);
	};

	this.getDomElement = function() {
		return container;
	};

	this.getTitle = function() {
		return item['title'];
	};

	this.getId = function() {
		return item['id'];
	};

	this.getElementId = function() {
		return elementId;
	};

	this.getParentId = function() {
		return item['parent_id'];
	};

	this.isLabel = function() {
		return item['is_label'] == 1;
	};

	this.isAssigned = function() {
		return item['is_assigned'] == 1;
	};

	this.getLevel = function() {
		return hierachy_level;
	};

	this.changeState = function(state) {
		if(state == 'cut')
			container.className = container.className + ' cut';
		else if(state == 'selected')
			container.className = container.className + ' selected';
		else if(state == 'unselected')
			container.className = container.className.replace(/ selected/, '');
		else if(state == 'uncut')
			container.className = container.className.replace(/ cut/, '');
		else
			container.className = 'item';
	}

	var title = create('a');
	title.appendChild(document.createTextNode(item['title']));
	title.className = "title";

	container.appendChild(title);
}