var ajaxCounter = 0;
var ajaxJobs = {};

var currentSettings = false;
var systemInitialized = false;
var pageReady = false;

readSettings();
$(document).ready(initSystem);


function initSystem() {
	if (!currentSettings) {
		pageReady = true;
		return;
	}
	systemInitialized = true;

	showMenu(currentSettings);

	$('#menu_visible_icon').bind('click', toggleVisMenu);
	$('#menu_visible_link').bind('click', toggleVisMenu);

	var fxt = 700;

	if ($.browser.msie && $.browser.version < 7) {
		fxt = false;
	}

	jQuery.cDrag.build({fx: fxt, handle: '.box_header', containers: '.menupanel', moveable: '.movable', onChange: saveDrag, onComplete: rebindHandlers});

	if ($.browser.msie && $.browser.version >= 7) {
		$('.showhide').each(initToggle);
	}

	bindClick('.showhide', toggleMenu);
	bindClick('.incBut', increase);
	bindClick('.decBut', decrease);
	$('.box_header').dblclick(toggleMenu);
}

function readSettings() {
	$.get(ajaxURL, {readSettings: 1}, readOrder, "json");
}

function readOrder(menuSort) {
	if (!menuSort) {
		$.get(ajaxURL, {readSettings: 1, skipCookie: 1}, checkBoxes, "json");
		return;
	}
	checkBoxes(menuSort);
}

function checkBoxes(menuSort) {
	if (!menuSort) return;

	var c = boxes.length;
	for (var i = 0; i < c; i++) {
		if (menuSort[boxes[i]] == undefined || menuSort[boxes[i]].p == undefined) {
			$.get(ajaxURL, {readSettings: 1, readDB: '1'}, readOrderFinal);
			return;
		}
	}

	currentSettings = menuSort;
	if (pageReady) initSystem();
}

function readOrderFinal(menusortString) {
	try {
		currentSettings = eval('(' + menusortString + ')');
		jQuery.cookie('menuSettings', menusortString, {expires: 356, path: '/bin/home/'} );

		if (pageReady) initSystem();
	} catch (ex) {

	}
}


/**
 * AJAX Scripts
 * 
 * Utilizing jQuery
 *
 * Saves all settings changed by scripts below.
 *
 */
 
function wakeAjax(mscript, menuName) {
	ajaxCounter++;
	setTimeout('runAjax(' + ajaxCounter + ')', 750);

	if (ajaxJobs[mscript] == undefined) {
		ajaxJobs[mscript] = [];
	}

	if (mscript == 'n') {
		if (ajaxJobs[mscript] == 'all') {
			return;
		}
		if (menuName == undefined) {
			ajaxJobs[mscript] = 'all';
			return;
		}
	}

	if (ajaxJobs[mscript].indexOf(menuName) >= 0) {
		return;
	}

	ajaxJobs[mscript].push(menuName);
}

function runAjax(counterCheck) {
	if (counterCheck < ajaxCounter) {
		return;
	}
	var ajaxVars = {counter: ajaxCounter};

	for (jobName in ajaxJobs) {
		var job = ajaxJobs[jobName];
		if (jobName == 'n' && job == 'all') {
			for (menuName in currentSettings) {
				var menuSettings = currentSettings[menuName];
				ajaxVars['allPositions[' + menuName + '][panel]'] = menuSettings.p;
				ajaxVars['allPositions[' + menuName + '][position]'] = menuSettings.n;
			}
			continue;
		}

		var l = job.length;
		for (var j = 0; j < l; ++j) {
			var menuName = job[j];
			ajaxVars[jobName + '[' + menuName + ']'] = currentSettings[menuName][jobName];
		}
	
	}

	ajaxJobs = {};

	document.body.style.cursor = 'wait';
	$.get(ajaxURL, ajaxVars, ajaxResponse);
}

function ajaxResponse(menusortString) {
	try {
		var test = eval('(' + menusortString + ')');
		jQuery.cookie('menuSettings', menusortString, {expires: 356, path: '/bin/home/'} );
	} catch (ex) {

	}
	document.body.style.cursor = 'default';
}

/**
 * Menu List Script
 * 
 * Utilizing jQuery
 *
 *
 */

function icon_switch(item, active) {
if (!item) return;

	var oldSrc = item.src;
	if (active) {
		item.src = oldSrc.replace('_ia', '');
		return;
	}
	if (oldSrc.indexOf('_ia') >= 0) return;
	
	var where = oldSrc.lastIndexOf('.');
	
	var start = oldSrc.substr(0, where);
	var end = oldSrc.substr(where);
	item.src = start + '_ia' + end;
}

function increase(e) {
	var menuName = this.id;

	menuName = menuName.substring(5, menuName.length - 4);

	if (currentSettings[menuName].s >= currentSettings[menuName].m) {
		return false;
	}

	currentSettings[menuName].s++;

	$('#menu_' + menuName + '_' + currentSettings[menuName].s).show();

	if (currentSettings[menuName].s >= currentSettings[menuName].m) {
		icon_switch(document.getElementById('menu_' + menuName + '_inc'), false);
//		document.getElementById('menu_' + menuName + '_inc').style.visibility = 'hidden';
	}
	if (currentSettings[menuName].s > 1) {
		icon_switch(document.getElementById('menu_' + menuName + '_dec'), true);
//		document.getElementById('menu_' + menuName + '_dec').style.visibility = 'visible';
	}

	wakeAjax('s', menuName);

	return false;
}

function decrease(e) {
	var menuName = this.id;
	menuName = menuName.substring(5, menuName.length - 4);

	if (currentSettings[menuName].s <= 1) return false;

	$('#menu_' + menuName + '_' + currentSettings[menuName].s).hide();

	currentSettings[menuName].s--;

	if (currentSettings[menuName].s <= 1) {
		icon_switch(document.getElementById('menu_' + menuName + '_dec'), false);
//		document.getElementById('menu_' + menuName + '_dec').style.visibility = 'hidden';
	}
	if (currentSettings[menuName].s < currentSettings[menuName].m) {
		icon_switch(document.getElementById('menu_' + menuName + '_inc'), true);
//		document.getElementById('menu_' + menuName + '_inc').style.visibility = 'visible';
	}

	wakeAjax('s', menuName);

	return false;
}

/**
 * Menu Show/Hide Script
 * 
 * Utilizing jQuery
 *
 *
 */
 
function toggleVisMenu() {
	var item = document.getElementById('menu_visible_icon');

	var oldSrc = item.src;
	
	if (oldSrc.indexOf('_down') >= 0) {
		item.src = oldSrc.replace('_down', '');

		$('#menu_visible').slideUp();
	
	} else {

	
		var where = oldSrc.lastIndexOf('.');

		var start = oldSrc.substr(0, where);
		var end = oldSrc.substr(where);
		item.src = start + '_down' + end;

		$('#menu_visible').slideDown();
	}

}

function toggleMenuDisplay(e) {
	var menuName = this.id.substr(13);

	var menuItem = $('#menu_' + menuName);


	if (this.checked) {
		menuItem.show();
	} else {
		menuItem.hide();
	}

	currentSettings[menuName].v = this.checked?'1':'0';

	wakeAjax('v', menuName);
	
	return true;

}

/**
 * Menu Collapse/Expand Script
 * 
 * Utilizing jQuery and Interface module iUtil
 *
 *
 */

jQuery.expr[':'].isrel = '(a.currentStyle && a.currentStyle.position == \'relative\')';

function initToggle() {
	var menuName = this.id.substring(5, this.id.length - 5);

	var relElems = $('#menu_' + menuName + '_cont :isrel');
	if (relElems.length > 0) {
		this.hasRelElems = true;
		var contItem = document.getElementById('menu_' + menuName + '_cont');
		contItem.relElems = relElems;
		contItem.toggleCount = 0;
	}
}

function relativeDisable() {
	if (this.toggleCount++ > 0) return;
	this.relElems.each(
		function() {
			this.style.position = 'static';
		}
	);
}

function relativeRevert() {
	if (this.toggleCount-- > 1) return;
	this.relElems.each(
		function() {
			this.style.position = 'relative';
		}
	);

}

function toggleMenu(e) {
	e.preventDefault();

	var menuName = this.id;
	menuName = menuName.substring(5, menuName.length - 5);

	var menuCont = $('#menu_' + menuName + '_cont');
	
	var isHidden = menuCont.is(":hidden");

	if (isHidden) {
		if (currentSettings[menuName].n < 0) currentSettings[menuName].n = -currentSettings[menuName].n;
	} else {
		if (currentSettings[menuName].n > 0) currentSettings[menuName].n = -currentSettings[menuName].n;
	}

	setMenuIcon(menuName, isHidden);

	if ($.browser.msie && $.browser.version < 7) {
		menuCont.toggle();
	} else if (this.hasRelElems) {
		menuCont.each(relativeDisable);
		menuCont.slideToggle('slow', relativeRevert);
	} else {
		menuCont.slideToggle();
	}

	wakeAjax('n', menuName);
	
	return false;
}

function setMenuIcon(menuName, expand) {
	var menuToggleImage = document.getElementById('menu_' + menuName + '_hide');
	if (menuToggleImage && menuToggleImage.src) {
		if (expand) {
			menuToggleImage.src = menuToggleImage.src.replace('show', 'hide');
		} else {
			menuToggleImage.src = menuToggleImage.src.replace('hide', 'show');
		}
	}
}

/**
 * Menu Dragging Script
 *
 * Utilizing jQuery and the jQuery.cDrag plugin
 *
 *
 */

function saveDrag(newList) {
	for (i in newList) {
		var items = newList[i];
		for (var j = 0; j < items.length; ++j) {
			var menuName = items[j].substring(5);
			var menuSettings = currentSettings[menuName];
			var expand = (menuSettings.n > 0);

			menuSettings.p = i;

			if (expand) {
				menuSettings.n = j+1;
			} else {
				menuSettings.n = -j-1;
			}
		}
	}
	wakeAjax('n');
}

/**
 * Misc Functions
 *
 */

function bindClick(selector, bindFunction) {
	var elm = $(selector);
	elm.click(bindFunction);

	elm.mousedown(stopEvent);
	elm.dblclick(stopEvent);

	if (jQuery.browser.msie) {
		elm.each(function() {this.unselectable = "on";});
	} else {
		elm.css('-moz-user-select', 'none');
		elm.css('user-select', 'none');
		elm.css('-khtml-user-select', 'none');
	}
}

function stopEvent(e) {
	if (e.stopPropagation) {
		e.stopPropagation();
	}
	e.cancelBubble = true;
}

function showMenu(menusort) {
	for (i in menusort) {
		if (menusort[i].n != undefined) menusort[i].n = parseInt(menusort[i].n);
		if (menusort[i].s != undefined) menusort[i].s = parseInt(menusort[i].s);
		if (menusort[i].m != undefined) menusort[i].m = parseInt(menusort[i].m);
	}

	currentSettings = menusort;

	var added = [];

	jQuery.each(menusort, function(menuName, settings) {
		var menuRealId = 'menu_' + menuName;
		var menuId = '#' + menuRealId;

		var menu = $(menuId);

		var panel = $('#' + settings.p + 'Panel');


		if (menu.get(0) && panel.get(0)) {
			var position = settings.n;
			if (position < 0) {
				position = -position;
				$(menuId + '_cont').hide();
				setMenuIcon(menuName, false);
			}

			if (added[settings.p] == undefined) {
//				panel.empty();
				added[settings.p] = [];

				for (var i = 1; i < position; ++i) {
					added[settings.p][i] = false;
				}
				added[settings.p][position] = menuId;
				panel.prepend(menu);
			} else {
				var childMenu = null;
				for (var i = 1; i < position; ++i) {
					if (added[settings.p][i]) {
						childMenu = added[settings.p][i];
					} else {
						added[settings.p][i] = false;
					}
				}
				added[settings.p][position] = menuId;
				if (childMenu) {
					jQuery(childMenu).after(menu);
				} else {
					panel.prepend(menu);
				}
			}
			if (settings.s) {
				for (var i = 1; i <= settings.s; i++) {
					$(menuId + '_' + i).show();
				}
				for (var i = settings.s + 1; i <= settings.m; i++) {
					$(menuId + '_' + i).hide();
				}

				if (settings.s <= 1) {
					icon_switch(document.getElementById('menu_' + menuName + '_dec'), false);
//					$(menuId + '_dec').get(0).style.visibility = 'hidden';
				}
				if (settings.s >= settings.m) {
					icon_switch(document.getElementById('menu_' + menuName + '_inc'), false);
//					$(menuId + '_inc').get(0).style.visibility = 'hidden';
				}
			}
			var checkbox = $('#menu_visible_' + menuName);
			checkbox.bind('click', toggleMenuDisplay);
			if (settings.v) {
				if (checkbox.get(0)) {
					checkbox.get(0).checked = true;
				}
			} else {
				menu.hide();
			}
		}
	});

	$('#menutable').show();
}

function rebindHandlers(item) {
	var menuId = '#' + item.id;

	$(menuId + '_hide').bind('click', toggleMenu);
	$(menuId + '_inc').bind('click', increase);
	$(menuId + '_dec').bind('click', decrease);
}

