/**
 * Citypress OY 2009
 * Juhani Pelli
 **/

(function(jQuery) {
	
  jQuery.fn.buildBalloon = function(divId, data, userConfig) {

		// yleiset parametrit kuplan luomiseen
		var config = {
			'id': divId, // there can be multiple balloon inside an element as long as they have different id
			'padding': {top:7,right:7,bottom:7,left:7}, // layerin reunan ja ikkunan todellisen reunan väliset etäisyydet
			'tipDistance': {left:10,top:20} // nuolen kärjen etäisyys ikkunan todellisesta reunasta
		};
		
		if (userConfig) jQuery.extend(config, userConfig);

		// kuplalle defaulttina annettavat muuttuvat parametrit
		var balloonData = { 
			'point': {x:0,y:0},
			'offset': {x:0,y:0},
			'padding': config.padding,
			'tipDistance': config.tipDistance,
			'anchor': "",
			'minHeight': 160,
			'visible': true,
			'busy': true,
			'closeButtonVisible': true,
			'closeFunction': function(){},
			'tipCss': {
				'bottomleft':{'background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_tip_righthand.png) 0% 100% no-repeat','width':'23px', 'height':'36px'},
				'bottomright':{'background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_tip_lefthand.png) 0% 100% no-repeat', 'width': '23px', 'height':'36px'},
				'topright':{'background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_tip_toplefthand.png) 0% 100% no-repeat', 'width': '14px', 'height':'22px'},
				'topleft':{'left':'182px', 'background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_tip_toprighthand.png) 0% 100% no-repeat', 'width': '14px', 'height':'22px'}
			}
		};

		if (data) jQuery.extend(balloonData, data);

		// html
		var html = '<div id="'+config.id+'" class="balloonWindow">';
		html += '<div class="balloonWindowTop"></div>';
		html += '<div class="balloonWindowMiddle">';
			html += '<div class="balloonActivityIndicator"></div>';
			html += '<div class="balloonWindowContent"></div>';
			html += '<div class="balloonWindowCloseButton" style="cursor: pointer; cursor: hand;"></div>';
		html += '</div>';
		html += '<div class="balloonWindowBottom"></div>';
		html += '<div class="balloonWindowTip" style="cursor: pointer; cursor: hand;"></div>';
		html += '</div>';


		this.each(function() {
			// luodaan/korvataan ikkuna elementin sisään
			jQuery(this).find('div#'+config.id).remove();
			jQuery(this).append(html);
			var balloonJQ = jQuery(this).find('div#'+config.id).eq(0);
			balloonJQ.data('balloonData', balloonData);

			// määritellään tyylit
			balloonJQ.css({'display': 'none','position': 'absolute',' left': '0',' top': '0',' width': '231px',' background': 'transparent','z-index': '9998', 'margin': '0', 'padding': '0'});
			balloonJQ.find('div.balloonWindowTop').css({'position':'relative','background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_top.png) 0% 0% no-repeat', 'width':'231px', 'height':'7px', 'margin': '0', 'padding': '0'});
			balloonJQ.find('div.balloonWindowMiddle').css({'position':'relative','background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_middle.png) 0% 0% repeat-y', 'width':'231px', 'margin': '0', 'padding': '0', 'overflow': 'hidden'});
			balloonJQ.find('div.balloonWindowBottom').css({'position':'relative','background':'transparent url(http://img1.ii2.org/html/beta/images/gmaps/balloon_bottom.png) 0% 0% no-repeat', 'width':'231px', 'overflow':'hidden','height':'7px', 'margin': '0', 'padding': '0'});
			balloonJQ.find('div.balloonWindowTip').css({'position':'absolute','z-index':'9999', 'margin': '0', 'padding': '0'});
			balloonJQ.find('div.balloonWindowContent').css({'display':'none','position':'relative','background':'#fff','margin':'0 7px','padding':'0','overflow':'hidden','width':'217px'});
			balloonJQ.find('div.balloonActivityIndicator').css({'display':'block','position':'relative','margin':'0 7px','overflow':'hidden','width':'217px', 'background':'white url(http://img1.ii2.org/html/beta/images/gmaps/activity.gif) 50% 50% no-repeat'});
			balloonJQ.find('div.balloonWindowCloseButton').css({'position': 'absolute', 'top': '4px', 'left': (231 - balloonData.padding.right - 4 - 16) + 'px', 'width': '16px', 'height': '16px', 'background': 'transparent url(http://rasia.city.fi/icon/fam/cross.png) no-repeat' });
			
			// eventit
			balloonJQ.find('div.balloonWindowTip, div.balloonWindowCloseButton').click(function(){
				balloonData.closeFunction.apply();
			});
		});

		return this;
	};

	jQuery.fn.refreshBalloon = function(divId, data) {
		this.each(function() {
			var balloonJQ = jQuery(this).find('div#'+divId).eq(0);
			var contentJQ = balloonJQ.find('div.balloonWindowContent').eq(0);
			var balloonData = balloonJQ.data('balloonData');
			
			// jos kuplaa ei ole vielä, luodaan se nyt
			if ( balloonData == undefined ) {
				jQuery(this).buildBalloon(divId);
				balloonJQ = jQuery(this).find('div#'+divId).eq(0);
				balloonData = balloonJQ.data('balloonData');
			}
			if ( data != undefined ) {
				jQuery.extend(balloonData,data);
				balloonJQ.data('balloonData', balloonData);
			}

			balloonJQ.css({visibility: "hidden", display: "block"});
			if ( balloonData.visible ) {
				if ( balloonData.closeButtonVisible ) {
					balloonJQ.find("div.balloonWindowCloseButton").show();
				} else {
					balloonJQ.find("div.balloonWindowCloseButton").hide();
				}
				if ( balloonData.busy ) {
					balloonJQ.find("div.balloonActivityIndicator").show();
					balloonJQ.find("div.balloonWindowContent").hide();
					balloonJQ.find("div.balloonWindowMiddle").css('height', balloonData.minHeight);
					balloonJQ.find("div.balloonActivityIndicator").css('height', balloonJQ.find("div.balloonWindowMiddle").height());
				} else if ( balloonData.html ) {
					contentJQ.html(balloonData.html);
					balloonJQ.find("div.balloonActivityIndicator").hide();
					balloonJQ.find("div.balloonWindowContent").show();
					balloonJQ.find("div.balloonWindowMiddle").css('height', balloonJQ.find("div.balloonWindowContent").height() > balloonData.minHeight ? balloonJQ.find("div.balloonWindowContent").height() : balloonData.minHeight);
				}
				jQuery(this).moveBalloon(divId, balloonData.point);
				balloonJQ.css({visibility: "visible"});
			}
		});
		
		return this;
	};

	jQuery.fn.moveBalloon = function(divId, point) {
		this.each(function() {
			
			var balloonJQ = jQuery(this).find('div#'+divId).eq(0);
			var tipJQ = balloonJQ.find("div.balloonWindowTip").eq(0);

			var balloonData = balloonJQ.data('balloonData');
			balloonData.point = point;
			balloonJQ.data('balloonData', balloonData);
			
			var tempPoint = {x: balloonData.point.x + balloonData.offset.x, y: balloonData.point.y + balloonData.offset.y};
			var leftPos = Math.round(tempPoint.x);
			var tipLeftPos = 0;
			var tipTopPos = 0;
			var topPos = Math.round(tempPoint.y);
			var anchor = balloonData.anchor;

			tipJQ.css(balloonData.tipCss["bottomleft"]);

			if ( !anchor ) {
				if ( jQuery(this).offset().top + tempPoint.y < ( balloonJQ.height() + tipJQ.height() - balloonData.padding.bottom - balloonData.padding.top ) ) {
					anchor = "top";
				} else {
					anchor = "bottom";
				}
				if ( tempPoint.x < ( jQuery(this).width() / 2 ) ) {
					anchor += "left";
				} else {
					anchor += "right";
				}
			}
			
			tipJQ.css(balloonData.tipCss[anchor]);
			
			if ( anchor == "bottomleft" ) {
				tipLeftPos = balloonData.tipDistance.left + balloonData.padding.left;
				leftPos -= tipLeftPos;
				topPos -= ( balloonJQ.height() + tipJQ.height() - balloonData.padding.bottom);
				tipTopPos = balloonJQ.height() - balloonData.padding.bottom;
			} else if ( anchor == "bottomright" ) {
				tipLeftPos = balloonJQ.width() - balloonData.padding.right - balloonData.tipDistance.left - tipJQ.width();
				leftPos -= tipLeftPos + tipJQ.width();
				tipTopPos = balloonJQ.height() - balloonData.padding.bottom;
				topPos -= balloonJQ.height() + tipJQ.height() - balloonData.padding.bottom;
			} else if ( anchor == "topright" ) {
				tipLeftPos = balloonJQ.width() - balloonData.padding.right;
				leftPos -= balloonJQ.width() - balloonData.padding.right + tipJQ.width();
				tipTopPos = balloonData.padding.top + balloonData.tipDistance.top;
				topPos -= tipTopPos + Math.round(tipJQ.height() / 2);
			} else if ( anchor == "topleft" ) {
				tipLeftPos = balloonData.padding.left - tipJQ.width();
				leftPos += tipJQ.width() - balloonData.padding.left;
				tipTopPos = balloonData.padding.top + balloonData.tipDistance.top;
				topPos -= tipTopPos + Math.round(tipJQ.height() / 2);
			}
			tipJQ.css({bottom: "auto", top: tipTopPos + "px", left: tipLeftPos + "px"});
			balloonJQ.css({left: leftPos+"px", top: topPos+"px"});
			if ( tempPoint.x > jQuery(this).width() + 10 || tempPoint.x < -10 || tempPoint.y > jQuery(this).height() + 10 || tempPoint.y < -10) {
				balloonJQ.hide();
			} else {
				balloonJQ.show();
				tipJQ.show();
			}
		});
		
		return this;
	}

 })(jQuery);

