(function($) {

var aModalWindows = new Array();

MoxmeWindow = function(){
	this.is_modal_show = false;
	this.win_obj = null;
	
	this.openAddress = function(address, callback_fuction) {
		this.win_obj.jqm({
			ajax:address
		});
		this.win_obj.jqmShow();		
	};	
}

MoxmeWindow.prototype.createWindow = function(window_name) {
	if(this.win_obj != null) return false;
	
	if (window_name == undefined || trim(window_name) == '' ) {
		var randomnumber = Math.floor(Math.random()*10001);
		window_name = 'window-modal-'+randomnumber;
	} else {
		window_name = trim(window_name);
	}
	
	if (  $("#"+window_name).length == 0 ) { 
		$(document.createElement("div")).attr("id", window_name).addClass('modalWindow').prependTo ("body"); 
	}	
	
	this.win_obj = $('#'+window_name).jqm({		
		ajaxText: '<div class="modalLoader"></div>',
		overlay: 60,
		onLoad: onLoadModal,
		onHide: onHideModal
	});	
	
	aModalWindows[window_name] = {};
	
	return true;
}

MoxmeWindow.prototype.openAddress = function(address, callback_fuction) {
	this.win_obj.jqm({
		ajax:address
	});
	this.win_obj.jqmShow();		
}

MoxmeWindow.prototype.reloadAddress = function(address) {	
	this.win_obj.jqm({
		ajax:address
	});
	this.win_obj.jqmReload();	
}

MoxmeWindow.prototype.setWidth = function(width) {
	this.win_obj.css({width:width}); 
}

MoxmeWindow.prototype.setAlign = function(align) {
	this.win_obj.css({'text-align':align}); 
}

MoxmeWindow.prototype.bindOnLoad = function(function_name) {
	aModalWindows[this.win_obj[0].id]._callback_onload = function_name;
}

MoxmeWindow.prototype.bindOnClose = function(function_name) {
	aModalWindows[this.win_obj[0].id]._callback_onclose = function_name;
}

MoxmeWindow.prototype.showWindow = function() {
	if(modalWindow.is_modal_show == false) {
		this.win_obj.jqmShow();	 
	}

	this.is_modal_show = true;
}

MoxmeWindow.prototype.closeWindow = function() { 
	this.win_obj.jqmHide();
	this.is_modal_show = false;
}

initModalWindow = function(window_id) {
	var options = { 
        target:        '#'+window_id,   // target element(s) to be updated with server response 
        beforeSubmit:  function(formData, mForm, options) { return onSubmitAjaxForm(window_id, formData, mForm, options);},  // pre-submit callback 
        success:       function(responseText) { onSuccessSubmit(window_id, responseText);}  // post-submit callback 
    }; 
    var win = $('#'+window_id);
    
	$('form', win).ajaxForm(options); 
	$('.modalLink', win).bind("click", onClickModalLink);
	$('.modalCloseLink', win).bind("click", onClickModalCloseLink);	
}

// ************* Event Listeners **************************************
onLoadModal = function(hash) { 
	window_id = hash.w[0].id;
	
	if(typeof(aModalWindows[window_id]._callback_onload) == 'function') {
		aModalWindows[window_id]._callback_onload.call();
	} else if(typeof(aModalWindows[window_id]._callback_onload) == 'string') {
		eval(aModalWindows[window_id]._callback_onload);
	}	
	
	initModalWindow(window_id);
	
	var win_obj = $('#'+window_id);
	var top = win_obj.position().top; 
	top = top - $(window).scrollTop();
	var popup_win_height = win_obj.height() + 40;
	if (top + popup_win_height > $(window).height()) {
   		top = $(window).height() - popup_win_height ;
       	if ( top < 0) {
       		top = 0;
       		var new_height = $(window).height()-30;
       		win_obj.css({height:new_height});
       	}
       	win_obj.css({top:top}); 
    } 
	
}

onHideModal = function(hash) {
	hash.w.fadeOut("slow");
	hash.o.fadeOut("slow");
	window_id = hash.w[0].id;
	if(typeof(aModalWindows[window_id]._callback_onclose) == 'function') {
		aModalWindows[window_id]._callback_onclose.call();
	} else if(typeof(aModalWindows[window_id]._callback_onclose) == 'string') {
		eval(aModalWindows[window_id]._callback_onclose);
	}
}


onClickModalLink = function (event) {
	modalRedirect(this, this.href);
	return false;
}

onClickModalCloseLink = function (event) {
	var modal_window = $(this).closest('div.modalWindow');
	modal_window.jqmHide();
	return false;
}

onSubmitAjaxForm = function(window_id, formData, mForm) {	
	
	if (typeof(mForm.validate) == 'function' && typeof(mForm.validate().form) == 'function') {	//validate form
		if ( mForm.validate().form() == false ) {
			return false;
		} 
	}
	
	$('#'+window_id).html('<div class="modalLoader"></div>');	
}

onSuccessSubmit = function(window_id, responseText) {	
	initModalWindow(window_id);		
}

// ********* General modal functions ******************** //

modalRedirect = function (element, url) {
	var modal_window = $(element).closest('div.modalWindow');
	
	modal_window.jqm({
		ajax: url
	});
	modal_window.jqmReload();
}

modalWindowClose = function(window_id) {
	if ( typeof(window_id) == 'object'  ) {
		var modal_window = $(window_id).closest('div.modalWindow');		
		modal_window.jqmHide();
	} else {
		$j("#"+window_id).jqmHide();
	}	
}


//********************* Tooltips ***************************** //
MoxmeWindow_createTooltip = function(tooltip_id, url, width) {
	tooltip_id = trim(tooltip_id);
	if ( tooltip_id == '' ) return false;
	
	window_name = 'window-tooltip-'+ tooltip_id;
	
	if (  $("#"+window_name).length == 0 ) { 
		$(document.createElement("div")).attr("id", window_name).addClass('modalTooltip').prependTo ("body"); 
	}	
	
	$('#'+window_name).jqm({		
		ajaxText: '<div class="modalLoader"></div>',
		overlay:0,
		onLoad: onLoadTooltip
	});	
	
	$("#"+tooltip_id).hover(
		function (event) {
			var obj_id = '';

			if ( event.target.tagName == 'EM' ) {
				obj_id = event.target.parentNode.id;
			} else {
				obj_id = event.target.id;
			}
			
			$('#window-tooltip-'+obj_id).jqm({ajax: url});			
			$('#window-tooltip-'+obj_id).jqmShow();
		},
		function (event) {
			var obj_id = '';
			if ( event.target.tagName == 'EM' ) {
				obj_id = event.target.parentNode.id;
			} else {
				obj_id = event.target.id;
			}

			$('#window-tooltip-'+obj_id).jqmHide();	
		}
	);
		
	$("#"+tooltip_id).mousemove(function(kmouse) {
		var obj_id = '';
		if ( kmouse.target.tagName == 'EM' ) {
			obj_id = kmouse.target.parentNode.id;
		} else {
			obj_id = kmouse.target.id;
		}
		
		var win_obj = $('#window-tooltip-'+obj_id);
		var left = kmouse.pageX;
		var top = kmouse.pageY; 
		top = top - $(window).scrollTop();
		
		if (top + win_obj.height() + 45 > $(window).height()) {
	       	top = top - win_obj.height() - 15;
	    } else {
	    	top += 15;
	    }
		
		if (left + win_obj.width() > $(window).scrollLeft() + $(window).width()) {
	       	left = left - win_obj.width() - 50;
	     } else {	     
	     	left +=15;
	     }
		win_obj.css({left:left, top:top}); 		
 	});
 	
 	if ( width != undefined ) {
 		$('#'+window_name).css({width:width}); 
 	} 
			
	return true;
}

function onLoadTooltip (hash) {
	window_id = hash.w[0].id;
	
	
	var win_obj = $('#'+window_id);
	var left = win_obj.position().left - 15;
	var top = win_obj.position().top - 15; 
	top = top - $(window).scrollTop();
	
	if (top + win_obj.height() + 45 > $(window).height()) {
       	top = top - win_obj.height() - 15;
    } else {
    	top += 15;
    }
	
	if (left + win_obj.width() > $(window).scrollLeft() + $(window).width()) {
       	left = left - win_obj.width() - 50;
     } else {	     
     	left +=15;
     }
	win_obj.css({left:left, top:top}); 
	
}

MoxmeWindow_createTooltipHTML = function(tooltip_id, content_id, width) {
	tooltip_id = trim(tooltip_id);
	if ( tooltip_id == '' ) return false;
	
	window_name = 'window-tooltip-'+ tooltip_id;
	
	if (  $("#"+window_name).length == 0 ) { 
		$(document.createElement("div")).attr("id", window_name).addClass('modalTooltip').prependTo ("body"); 
	}	
	
	$('#'+window_name).jqm({		
		overlay:0
	});	
	
	var content_text = '';
	if ( $('#'+content_id).length ) {
		content_text = $('#'+content_id).html()
	} else {
		content_text = content_id;
	}
	
	$('#'+window_name).html(content_text);
	
	$("#"+tooltip_id).hover(
		function (event) {
			var obj_id = event.target.id;
			$('#window-tooltip-'+obj_id).jqm();			
			$('#window-tooltip-'+obj_id).jqmShow();				
		},
		function (event) {
			var obj_id = event.target.id;
			$('#window-tooltip-'+obj_id).jqmHide();	
		}
	);
	
	$("#"+tooltip_id).mousemove(function(kmouse){
		var obj_id = kmouse.target.id;
		var win_obj = $('#window-tooltip-'+obj_id);
		var left = kmouse.pageX;
		var top = kmouse.pageY - win_obj.height() / 2; 
		top = top - $(window).scrollTop();
		
	    if ( top + win_obj.height()  > $(window).height() ) {
	    	top = $(window).height() - win_obj.height();
	    } else if (top < 0 ) {
	       	top = 0;
	    } 
		
		if (left + win_obj.width() > $(window).scrollLeft() + $(window).width()) {
	       	left = left - win_obj.width() - 50;
	     } else {	     
	     	left +=15;
	     }
		win_obj.css({left:left, top:top}); 		
 	});
 	
 	if ( width != undefined ) {
 		$('#'+window_name).css({width:width}); 
 	} 
			
	return true;
}

})(jQuery);
