/**
 * @author: Ika Nakani
var inf = null;
inf = new informer({
	'url' : '/ajax/file.php',
	'selector' : 'a.informer',
	'attr' : 'id',
});	
 */
var informer;
if (informer == undefined){
	function informer (settings){
		if (settings == undefined) {
			settings = {};
		}
		this.settings = settings;
		this.div = null;
		this.content = [];
		this.contentSize = {width:0, height:0};		
		this.instName = 'Informer'+(informer.count++);
		informer.instances[this.instName] = this;
		var self = this;
		$(document).ready(function(){
			self.createDivContainer();
			self.initSettings();
			self.initElements();
		});
	}
}

informer.instances = {};

informer.prototype = {
	initSettings : function (){
		this.ensureDefault = function (settingName, defaultValue) {
			this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
		};
		this.ensureDefault('url', '/ajax/file.php');
		this.ensureDefault('selector', 'a.informer');
		this.ensureDefault('attr', 'id');
		delete this.ensureDefault;
	},
	initElements : function (){
		var self = this;
		$(this.settings['selector'])
		.bind('mousemove', function(ev){
			self.calcPosition(ev);
		})
		.bind('mouseover', function(ev){
			self.getContent($(this).attr(self.settings['attr']),this);
		})
		.bind('mouseout', function(ev){
			self.div.html('');
			self.div.css({
				position : 'absolute',
				left : -2000,
				top : -2000,
				width : 'auto',
				height : 'auto'
			});
		})
		.bind('contentLoad', function(ev, content, par){
			if (!self.content[par])
				self.content[par] = content;
			self.div.html(content);
			self.contentSize = {width: self.div.width(),height: self.div.height()};
			self.div.css({width:self.contentSize.width, height:self.contentSize.height});
			self.calcPosition(ev);
		});
	},
	createDivContainer : function(){
		var element = document.createElement("div");
		$(element)
			.css({
				position : 'absolute',
				left : -2000,
				top : -2000,
				'z-index' : 1000
			});
		document.body.appendChild(element);
		this.div = $(element);
	},
	getContent : function(par, elem){
		if (this.content[par]){
			$(elem).trigger('contentLoad', [this.content[par],par]);
			return;
		}
		$.ajax({
			async : false,
			url : this.settings['url'],
			data : {id : par},
			dataType : 'jsonp',
			scriptCharset : 'utf-8',
			type : 'GET',
			success : function(ans){
				$(elem).trigger('contentLoad', [String(ans.content),par]);
				return;
			}
		});
		return;
	},
	calcPosition:function(ev){
		var ms = this.mouseCoords(ev);
		var scroll = this.getScrollValue();
		var page = {width:$(window).width(), height:$(window).height()}; 
		var left=0, top=0;
		//определяем слва или справа будет блок
		if (((ms.x-scroll.left) + this.contentSize.width) < (page.width-15)){
			left = 15;
		}else if ((ms.x-scroll.left) > (this.contentSize.width+15)){
			left = - (this.contentSize.width+15);
		}else {
			left = (page.width - this.contentSize.width) - (ms.x-scroll.left);
		}
		//определяем снизу или сверху
		if (((ms.y-scroll.top)+this.contentSize.height) < (page.height-15)){
			top = 15;
		}else if ((ms.y-scroll.top) > (this.contentSize.height+15)){
			top = -(this.contentSize.height+15);
		}else {
			top = (left > 0)? - (ms.y-scroll.top) : 15;
		}
		this.div.css({
			position : 'absolute',
			top : ms.y + top,
			left : ms.x + left,
			width : this.contentSize.width,
			height : this.contentSize.height
		});
	},
	destroy : function (){
		$(this.settings['selector']).unbind();
		this.settings = null;
		this.div = null;
		this.content = null;
		this.contentSize = null;	
		delete informer.instances[this.instName];
	},
	mouseCoords : function(ev){
		var x=0,y=0;
		if(ev.pageX || ev.pageY){x=ev.pageX, y=ev.pageY;}
		else{
			x=ev.clientX + document.body.scrollLeft - document.body.clientLeft;
			y=ev.clientY + document.body.scrollTop  - document.body.clientTop;
		}
		return {x:x, y:y};
	},
	getScrollValue:function(){
		if (window.pageYOffset){
			return {top:window.pageYOffset, left: window.pageXOffset};
		}else if(document.documentElement){
			return {top:document.documentElement.scrollTop, left: document.documentElement.scrollLeft};
		}else{
			return {top:document.body.scrollTop, left: document.body.scrollLeft};
		}
	}
};
