// Pull in drag event if its not defined.
if (undefined == jQuery.fn.drag) {
	(function(E){E.fn.drag=function(L,K,J){if(K){this.bind("dragstart",L)}if(J){this.bind("dragend",J)}return !L?this.trigger("drag"):this.bind("drag",K?K:L)};var A=E.event,B=A.special,F=B.drag={not:":input",distance:0,which:1,dragging:false,setup:function(J){J=E.extend({distance:F.distance,which:F.which,not:F.not},J||{});J.distance=I(J.distance);A.add(this,"mousedown",H,J);if(this.attachEvent){this.attachEvent("ondragstart",D)}},teardown:function(){A.remove(this,"mousedown",H);if(this===F.dragging){F.dragging=F.proxy=false}G(this,true);if(this.detachEvent){this.detachEvent("ondragstart",D)}}};B.dragstart=B.dragend={setup:function(){},teardown:function(){}};function H(L){var K=this,J,M=L.data||{};if(M.elem){K=L.dragTarget=M.elem;L.dragProxy=F.proxy||K;L.cursorOffsetX=M.pageX-M.left;L.cursorOffsetY=M.pageY-M.top;L.offsetX=L.pageX-L.cursorOffsetX;L.offsetY=L.pageY-L.cursorOffsetY}else{if(F.dragging||(M.which>0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY)<M.distance){break}L.target=M.target;J=C(L,"dragstart",K);if(J!==false){F.dragging=K;F.proxy=L.dragProxy=E(J||K)[0]}case"mousemove":if(F.dragging){J=C(L,"drag",K);if(B.drop){B.drop.allowed=(J!==false);B.drop.handler(L)}if(J!==false){break}L.type="mouseup"}case"mouseup":A.remove(document,"mousemove mouseup",H);if(F.dragging){if(B.drop){B.drop.handler(L)}C(L,"dragend",K)}G(K,true);F.dragging=F.proxy=M.elem=false;break}return true}function C(M,K,L){M.type=K;var J=E.event.handle.call(L,M);return J===false?false:J||M.result}function I(J){return Math.pow(J,2)}function D(){return(F.dragging===false)}function G(K,J){if(!K){return }K.unselectable=J?"off":"on";K.onselectstart=function(){return J};if(K.style){K.style.MozUserSelect=J?"":"none"}}})(jQuery);
};

(function($){
	$.fn.flagmap = function(options) {
		var opts = $.extend($.fn.flagmap.defaults, options);
		return $(this).each(function(){
			$this = $(this);
			
			save = $.fn.flagmap.save;
			
			var pane = $(opts.pane, $this);
			var mapoffset = $this.offset();
			
			var points	= $(opts.points, $this);
			var markers	= $(opts.markers, $this);
			var flags	= $(opts.flags, $this);

			if (opts.editable) {
				initEdit();
			} else {
				initView();
			};
			
			function initEdit () {
				bindDrags();
				bindSave();
				bindHovers();
			}
			
			function initView () {
				bindHovers();
			}
			
			function bindHovers () {
				points.hover(function(e) {
					$(this).addClass('hover');
				}, function(e) {
					$(this).removeClass('hover');
				});
			}

			function bindDrags() {
				markers.click(function(e) {
					e.preventDefault();
				});
				markers.drag(function(e) {
					$(this).parent().addClass('dragging');
					e.preventDefault();
				},function(e) {
					updatePosition(this, e);
				},function(e) {
					$(this).parent().removeClass('dragging se sw ne nw').addClass('dirty '+getClass($(this).parent()));
					e.preventDefault();
				});
			}

			function unBindDrags () {
				markers.unbind('drag');
			}
			
			function bindSave() {
				$(opts.save, $this).click(function(e) {
					savePositions();
					e.preventDefault();
				});
			}
			
			function getClass (point) {
				var y = parseFloat(point.css('top'));
				var x = parseFloat(point.css('left'));
				if (x<=50 && y<=50) return 'se';
				if (x<=50 && y>50) return 'ne';
				if (x>50 && y<=50) return 'sw';
				if (x>50 && y>50) return 'nw';
			}
			
			function updatePosition(el, e) {
				var left = 100 * (e.offsetX - mapoffset.left) / pane.outerWidth();
				var top = 100 * (e.offsetY - mapoffset.top) / pane.outerHeight();
				
				if (left < 0) left = 0;
				if (top < 0) top = 0;
				if (left > 100) left = 100;
				if (top > 100) top = 100;
				
				$(el).closest(opts.points).css({left: left+'%', top: top+'%'});
			}
			
			function savePositions() {
				if (points.filter('.dirty').length > 0) {
					save(points.filter('.dirty'));
				} else {
					alert('No changes to save');
				}
			}

		});
	};

	$.fn.flagmap.save = function(points) {
		var topost = {inline_action : 'save'};
		var point;
		points.each(function(i,val) {
			point = $(val);
			var id = parseInt(point.attr('id').match(/\d+$/)[0])
			topost['inline['+id+'][point_x]]'] = parseFloat(point.css('left'));
			topost['inline['+id+'][point_y]]'] = parseFloat(point.css('top'));
		});
		
		var modelid = parseInt(point.attr('id').match(/\d+/)[0])
		
		$.post('/cp/linked/core_flag-map/'+modelid+'/map-points', topost, function(response, status) {
			if ('success' == response.result) {
				if (undefined != api) {} api.close();
				window.location = window.location;
			}
			else {
				alert('Point could not be saved');
			}
		}, 'json');
	};

	$.fn.flagmap.defaults = {
		editable: false,
		pane: '.flagmap',
		points: '.mappoint',
		markers: '.pointmarker',
		flags: '.flagpoint',
		save: '.flagmap-save'
	};
	
})(jQuery);
