var Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}


function wz_tooltip_Menu(ulid, admin) {
	
	var wz_tooltip_Menu = ntaxaMenu(ulid, {
						draggableclass:   		'draggableclass',
						irrelevantclass:		'irrelevant',
						draghandleclass:		'draghandle',
						folderclass:      		'folder',
						overclass: 				'over',
						draggedclass:     		'draggedclass',
						dragoverclass:			'dragoverclass',
						openedclass:     		'openedclass',
						newsubmenudummyclass:	'newsubmenudummyclass', 
						irrelevantfolderclass:	'irrelevantfolderclass',
						irrelevantoverclass:	'irrelevantoverclass',
						newsubmenudummytext:  	'<div style="width:274px; padding-left: 15px;">Drop here<div>', 
						onOver: 				function(lie,def) {
																	if (wz_tooltip_Menu.dragging) return false;
																	if (def) {
																		lie.down('div').style.backgroundImage="url(/img/menu_over.png)"
																		if (wz_tooltip_Menu.admin) 
																			wz_tooltip_Menu.showControls(lie);
																		}
																	return def;
																	},
						onOut: 					function(lie,def) {
																	if (wz_tooltip_Menu.dragging) return false;
																	if (def) {
																		lie.down('div').style.backgroundImage="url(/img/menu_item.png)";
																		if (wz_tooltip_Menu.admin) 
																			wz_tooltip_Menu.hideControls();
																		}
																	return def;
																	},
						onStartDragging: function (lie, ule) {
																	if (wz_tooltip_Menu.menuInPlaceEditor) 
																		wz_tooltip_Menu.menuInPlaceEditor.handleFormCancellation();
																	wz_tooltip_Menu.hideControls();
																	},
						onEndDragging:	function(lie, ule, index) {
									wz_tooltip_Menu.froze = true;
									setTimeout("mainmenu.froze = false", 250);
									new Ajax.Request(
												 '/menu_move.html?menu_id=' + 
															lie.id.replace(/li_/,'') + '&menu_newindex='+index+'&menu_row[parent_id]=' + 
															ule.id.replace(/ul_/,'') + '&rand=' + Math.random(),
													{
													method: 'GET',
													onSuccess: function(transport) {
														
														},
													onFailure: function() {
														alert('server error');
														}
													 }
												 );
									},
						onChange:	function (lie) {
											if ($('add_item_li_0').nextSibling)
											wz_tooltip_Menu.insertBefore($('add_item_li_0').nextSibling, $('add_item_li_0'));
											},
						timeout: 200
						});

	wz_tooltip_Menu.menuInPlaceEditor = null;
	wz_tooltip_Menu.menuOldSpanValue = '';
	wz_tooltip_Menu.admin = admin;
	wz_tooltip_Menu.showntooltipid = 0;

	wz_tooltip_Menu.getURL = function (l) {
		if (!this.froze && !this.dragging && !this.menuInPlaceEditor && l)
			document.location.href = l;
		}
	
	wz_tooltip_Menu.isMenuItemDropable = function(element,parentelement,prevelement,nextelement,def) {
	return def;
	}

	wz_tooltip_Menu.createAddItemLI = function(ule) {
	ule = $(ule);
	if (!ule) return;
	tmpid = ule.id.replace(/ul_/,'');
		ule.insert({'bottom': '<li class="'+wz_tooltip_Menu.options.irrelevantfolderclass + ' ' + wz_tooltip_Menu.options.irrelevantoverclass +'" id="add_item_li_'+tmpid+'"><div id="div_menu_add_'+tmpid+'" class="adddiv"><img src="/img/0.png" width="15" height="15"><a '
		+'href="#" id="a_menu_add_'+tmpid+'" onClick="return menuAddForm(\''+tmpid+'\');"><span>Add menu item</span></a></div></li>'
		});
	}

wz_tooltip_Menu.showControls = function(lie) {
	if (this.dragging || this.froze || this.menuInPlaceEditor) return;
	if (!lie.id.match(/^li_[\d]+$/)) return this.hideControls();
	var lieid = lie.id.replace(/li_/,'');
	if (this.showntooltipid == lieid) return;
	this.showntooltipid = lieid;
	var actionicons = new Array('editable','activable','deletable');
	var activebuttons=0;
	for (ii=0; ii<actionicons.length; ii++ ) {
			if ($('li_'+lieid).readAttribute(actionicons[ii])=='1')
				{
				activebuttons++;
				$('controldiv').down('a',ii).show();
				}
			else {
				$('controldiv').down('a',ii).hide();
				}
			}
	
	if (activebuttons) {
		$('controldiv').down('img',1).src = '/img/active_'+ (($('li_'+lieid).readAttribute('active')=='1')?'1':0) +'.png';
		$('WzTtDiV').show();
		TagToTip('controldiv', STICKY, true, OFFSETY, -5, FADEIN, 0,FADEOUT,0, WIDTH, 60, DELAY, 500);
		}
	else {
		
		}
	}
	
wz_tooltip_Menu.hideControls = function() {
	this.showntooltipid = 0;
	$('WzTtDiV').hide();
	UnTip();
	}
	
wz_tooltip_Menu.higlightActive = function(lie) {
	lie = $(lie);
	var tmpid = lie.id.replace(/li_/,'');
	var tmpactive = ((lie.readAttribute('active')=='1')?'1':0);
	if (!tmpactive) 
		lie.down('span').addClassName('inactiveitem');
	else 
		lie.down('span').removeClassName('inactiveitem');
	}

	
wz_tooltip_Menu.addLI = function(transport,spanelement) {
	if (transport && transport.responseText.match(/^[\d]+:[\d]+:.*$/)) {
		var newval = Url.decode(transport.responseText.replace(/^[\d]+:[\d]+:/,''));
		var newvar = transport.responseText.replace(/^[\d]+:([\d]+):.*$/,"$1");
		wz_tooltip_Menu.restoreFailedLI(false,spanelement);
		wz_tooltip_Menu.addItem($('dummynewli').innerHTML.replace(/__id__/g,newvar).replace(/__title__/g,newval),spanelement.up('li'),'top');
		}
	else {
		wz_tooltip_Menu.restoreFailedLI(transport,spanelement);
		}
	}

wz_tooltip_Menu.updateLI = function(transport,spanelement) {
	if (transport && transport.responseText.match(/^[\d]+:.*$/)) {
		var newval = Url.decode(transport.responseText.replace(/^[\d]+:/,''));
		var newvar = transport.responseText.replace(/^([\d]+):.*$/,"$1");
		if ($('li_' + newvar)) {
			$('li_' + newvar).down('span').innerHTML = newval;
			}
		this.savingliid = 0;
		}
	else {
		wz_tooltip_Menu.restoreFailedLI(transport,spanelement);
		}
	}

wz_tooltip_Menu.restoreFailedLI = function(transport,spanelement) {
	if (spanelement) {
		spanelement.innerHTML = spanelement.readAttribute('oldvalue');
		spanelement.writeAttribute('oldvalue','');
		}
	if (transport) {
		alert("Error communicating with the server: " + transport.responseText.stripTags());
		}
	}

wz_tooltip_Menu.showMenuForm = function(spanid, ajaxsxript, createurlfunction, onComplete, onFailure) {
		wz_tooltip_Menu.froze = true;
		if (wz_tooltip_Menu.menuInPlaceEditor) {
			wz_tooltip_Menu.menuInPlaceEditor.handleFormCancellation(null);
			};
		
		wz_tooltip_Menu.menuInPlaceEditor = new Ajax.InPlaceEditor(spanid,ajaxsxript, {
			okControl:				false,
			cancelControl:			false,
			externalControlOnly:	true,
			submitOnBlur:			false,
			highlightcolor:			'',
			highlightendcolor:		'',
			formId:					'inplaceeditorform_id',
			callback:				createurlfunction,
			onFormCustomization: function (inplaceeditor, form) {
				Event.observe(form.down('input'),'keydown',inplaceeditor.checkForEscapeOrReturn.bind(inplaceeditor));
				},
			onComplete: 			function (transport,spanelement) {
										wz_tooltip_Menu.menuInPlaceEditor.destroy();
										delete wz_tooltip_Menu.menuInPlaceEditor;
										wz_tooltip_Menu.menuInPlaceEditor = null;
										wz_tooltip_Menu.froze = false;
										if (!transport && onFailure) 
											return onFailure(transport,spanelement); 
										if (transport && onComplete)
											onComplete(transport,spanelement);
										},
			onFailure: 				function (transport,spanelement) {
										wz_tooltip_Menu.menuInPlaceEditor.destroy();
										delete wz_tooltip_Menu.menuInPlaceEditor;
										wz_tooltip_Menu.menuInPlaceEditor = null;
										wz_tooltip_Menu.froze = false;
										if (onFailure) onFailure(transport,spanelement);
										}
			});
		this.menuInPlaceEditor.getText = function() {
				return this.element.innerHTML;
				},
		$(spanid).writeAttribute('oldvalue',$(spanid).innerHTML);
		this.hideControls();
		this.menuInPlaceEditor.enterEditMode();
	}
	

wz_tooltip_Menu.showMenuUpdateForm = function() {
		if (!this.showntooltipid) return;
		var editid = this.showntooltipid;
	
		this.showMenuForm($('li_'+editid).down('span'),'/menu_update.html',function(form, value) {
										return 'menu_id='+ editid +'&menu_row[title]=' +Url.encode(value);
										}, this.updateLI, this.restoreFailedLI);
	}
	
	
wz_tooltip_Menu.showMenuAddForm = function(addid) {
		this.showMenuForm($('add_item_li_'+addid).down('span'),'/menu_add.html',function(form, value) {
										return 'menu_row[parent_id]='+ addid +'&menu_row[title]=' +Url.encode(value);
										}, this.addLI, this.restoreFailedLI);
	}

	
wz_tooltip_Menu.removeMenuItem = function() {
	if (!$('li_' + this.showntooltipid)) return;
	var tmpid=this.showntooltipid;
		if (confirmLink('Are you sure? You want remove menu item `' + $('li_' + tmpid).down('span').innerHTML + '`?')) {
			if ( $('ul_' + tmpid).select('li').any( function (lie) {return ( !lie.hasClassName(wz_tooltip_Menu.options.irrelevantfolderclass) )} ) &&
					!confirmLink('Thes menu item has submenu items. If you sure you want remove please press OK') )
					return;
			new Ajax.Request(
				 '/menu_delete.html?menu_id=' + tmpid + '&rand=' + Math.random(),
				 	{
					method: 'get',
					onSuccess: function(transport) {
						if (transport.responseText.match(/^([\d]+:)+$/)) {
							var nevar = transport.responseText.replace(/^([\d]+).*$/,"$1");
							if ($('li_' + nevar))
								wz_tooltip_Menu.removeItem('li_' + nevar);
							if (nevar == this.showntooltipid) {
								$('WzTtDiV').hide();
								UnTip();
								}
							}
						else
							alert('server error: ' + transport.responseText);
						},
					onFailure: function() {
							alert('server error');
						}
					 }
				 );
			}
		}

wz_tooltip_Menu.switchMenuItem = function() {
	if (!$('li_' + this.showntooltipid)) return;
	var tmpid=this.showntooltipid;
	var setto = ($('li_' + tmpid).readAttribute('active')=='1'?'0':'1');
	new Ajax.Request(
				 '/menu_active.html?menu_id=' + tmpid + '&menu_row[active]=' + setto + '&rand=' + Math.random(),
				 	{
					method: 'get',
					onSuccess: function(transport) {
						if (transport.responseText.match(/^[\d]+:(1|0)$/))  {
							var newval = transport.responseText.replace(/[\d]+:/,'');
							var newvar = transport.responseText.replace(/:(1|0)$/,'');
							if ($('li_' + newvar)) {
								$('li_' + newvar).writeAttribute({active: newval});
								wz_tooltip_Menu.higlightActive($('li_' + newvar));
								if (newvar == wz_tooltip_Menu.showntooltipid) {
									$('WzTtDiV').down('img',1).src = '/img/active_' + newval + '.png';
									}
								}
							}
						else
							alert('server error: ' + transport.responseText);
						},
					onFailure: function() {
							alert('server error');
						}
					 }
				 );
	}
	


return wz_tooltip_Menu;

}