(function($) {

	var defaults = { anchor : '', preCall : '', startId: '', callBack: ''};

	$.fn.roadmap = function(params){
		var options = $.extend({}, defaults, params);
		options.prefix = getPrefix(0000,9999);
		init(this);

		function init(e) {
			return e.each(function(){
				$(this).click(function(){
					if (options.preCall) {
						options.startId = eval(options.preCall)();
					}
					open_map($(this));
					return false;
				});
			});
		}
		
		function get_roads() {
			var vals = $('#' + options.prefix + '_form_road').val();
			return clean_arr(vals.split(','));
		}
		
		function set_roads(arr) {
			$('#' + options.prefix + '_form_road').val(implode(',',arr));
		}
		
		function clean_arr(arr) {
			var a = new Array;
			for(var i = 0, l = arr.length; i < l; i++)  {
				if(arr[i]) {
					a[a.length] = arr[i];
				}
			}
			return a;
		}
		
		function in_array(need, arr) {
			for(var i = 0, l = arr.length; i < l; i++)  {
				if(arr[i] == need) {
					return true;
				}
			}
			return false;
		}
		
		function get_posistion(element) {
			var offset = element.offset();
			return {left: offset.left , top: offset.top}
		}
		
		function open_map(element) {
			var pos = get_posistion(element);
			
			popupbox = new popupBox({width: 900, top: pos.top, prefix: options.prefix});
			popupbox.openBox(getData());
			
			addStartId();
			listen();

			return false;
		}
		
		function getData(){
		
			var roads_coords = [
				{
					'id' : 412,
					'coords' : '281,180,284,172,290,168,297,165,304,166,305,173,296,173,289,176,287,182',
					'name' : 'Алтуфьевское'
				}, 
				{
					'id' : 413,
					'coords' : '221,342,225,348,204,352,185,368,168,371,148,392,146,397,139,401,143,389,153,382,165,364,183,362,200,346',
					'name' : 'Боровское'
				}, 
              {
					'id' : 414,
					'coords' : '281,399,284,411,281,436,279,485,263,541,261,567,254,567,257,539,272,486,275,436,276,414',
					'name' : 'Варшавское'
				}, 
              {
					'id' : 415,
					'coords' : '205,231,199,233,195,239,187,238,177,227,167,228,160,223,143,220,117,203,108,199,91,199,78,191,51,183,45,184,53,190,78,197,89,205,106,205,113,209,141,226,153,228,163,234,175,235,182,241,191,245,199,245,206,237',
					'name' : 'Волоколамское'
				}, 
              {
					'id' : 416,
					'coords' : '375,263,374,272,400,260,425,258,566,234,564,226,420,250,399,253',
					'name' : 'Горьковское'
				}, 
              {
					'id' : 417,
					'coords' : '262,181,270,179,263,136,271,115,267,88,260,78,262,43,247,25,261,3,252,3,240,24,240,32,254,47,252,77,258,89,263,115,256,135',
					'name' : 'Дмитровское'
				}, 
              {
					'id' : 418,
					'coords' : '403,341,406,347,426,347,439,343,455,343,486,354,502,365,523,362,534,366,541,361,560,368,567,372,567,365,557,359,539,354,531,358,523,354,504,357,491,350,455,337,438,336,427,339',
					'name' : 'Егорьевское'
				}, 
              {
					'id' : 419,
					'coords' : '199,245,179,264,168,280,139,285,110,298,101,294,88,301,85,295,100,288,112,290,134,280,163,276,174,259,191,244',
					'name' : 'Ильинское'
				}, 
              {
					'id' : 420,
					'coords' : '243,376,211,424,182,447,175,465,149,513,113,567,124,567,177,477,185,454,210,434,248,381',
					'name' : 'Калужское'
				}, 
				{
					'id' : 421,
					'coords' : '333,392,338,387,346,396,349,408,353,422,349,439,341,454,345,464,350,468,349,480,349,490,353,500,359,512,364,527,362,538,357,551,356,558,355,567,349,566,352,548,354,539,358,531,359,525,355,519,349,504,344,493,342,484,343,472,337,465,333,455,337,447,343,438,346,427,345,413,341,400',
					'name' : 'Каширское'
				}, 
             
              {
					'id' : 422,
					'coords' : '229,355,231,361,70,437,3,512,3,503,65,432',
					'name' : 'Киевское'
				}, 
              {
					'id' : 423,
					'coords' : '219,201,225,198,222,195,206,195,202,188,206,183,213,183,207,177,201,180,197,185,197,192,201,200,209,203',
					'name' : 'Куркинское'
				}, 
              {
					'id' : 424,
					'coords' : '231,196,189,141,130,101,128,89,97,38,60,3,50,3,92,41,116,82,121,91,122,103,182,144,225,200',
					'name' : 'Ленинградское'
				}, 
              {
					'id' : 425,
					'coords' : '208,314,194,321,182,340,171,350,156,355,142,368,73,381,3,395,3,388,136,363,151,350,166,345,181,330,190,315,205,307',
					'name' : 'Минское'
				}, 
              {
					'id' : 426,
					'coords' : '185,325,154,337,122,339,90,353,71,360,55,360,37,358,3,373,3,381,38,367,69,369,92,361,112,350,127,346,152,343,171,336,180,335',
					'name' : 'Можайское'
				}, 
				 {
					'id' : 427,
					'coords' : '315,401,311,415,319,420,317,430,336,465,351,477,355,493,349,515,348,533,361,547,359,561,362,567,367,567,368,544,356,532,355,515,361,504,362,487,357,474,343,463,334,443,327,430,325,417,319,410,322,396',
					'name' : 'Новокаширское'
				}, 
              {
					'id' : 428,
					'coords' : '203,251,176,249,158,256,148,265,138,266,115,258,98,259,89,256,74,238,52,240,18,229,3,220,3,228,20,238,48,245,72,245,81,259,92,265,106,265,117,265,133,271,147,272,160,263,177,256,202,258',
					'name' : 'Новорижское'
				}, 
              {
					'id' : 429,
					'coords' : '373,328,390,337,404,354,426,374,429,383,458,409,483,435,493,456,505,472,516,499,535,498,556,517,563,517,567,521,567,530,561,523,550,523,533,505,517,506,511,504,499,475,487,461,479,438,424,388,419,374,401,362,388,344,373,337',
					'name' : 'Новорязанское'
				}, 
              {
					'id' : 648,
					'coords' : '207,177,197,176,191,170,173,163,176,158,195,164,204,172',
					'name' : 'Новосходненское'
				}, 
              {
					'id' : 430,
					'coords' : '376,291,433,290,508,293,508,285,427,282,375,285',
					'name' : 'Носовихинское'
				}, 
              {
					'id' : 431, 
					'coords' : '307,190,304,173,302,155,308,143,326,142,337,135,355,142,361,156,361,166,354,156,349,146,337,141,330,149,313,150,308,155,313,190',
					'name' : 'Осташковское'
				}, 
              {
					'id' : 432,
					'coords' : '206,234,186,212,179,202,136,179,131,165,119,167,99,149,95,141,80,131,70,116,50,102,40,103,26,101,22,77,31,70,32,50,38,45,31,26,37,10,47,3,52,7,44,14,39,27,44,42,45,48,39,54,37,72,30,79,33,95,52,95,76,112,88,125,103,138,122,159,136,160,143,175,177,193,188,199,192,207,207,223',
					'name' : 'Пятницкое'
				}, 
              {
					'id' : 433,
					'coords' : '260,122,251,108,223,95,184,45,180,40,184,21,182,3,176,4,178,22,174,42,217,99,245,112,258,128',
					'name' : 'Рогачевское'
				}, 
              {
					'id' : 434, 
					'coords' : '200,275,199,282,189,291,113,311,95,313,93,317,105,345,99,347,84,317,90,305,112,304,184,285,192,275',
					'name' : 'Рублево-Успенское'
				}, 
              {
					'id' : 435,
					'coords' : '282,399,288,424,287,486,281,538,266,567,275,567,288,541,297,482,294,421,288,400',
					'name' : 'Симферопольское'
				}, 
              {
					'id' : 928,
					'coords' : '211,318,215,323,203,337,197,333',
					'name' : 'Сколковское'
				}, 
              {
					'id' : 436,
					'coords' : '375,245,412,230,428,214,436,199,456,190,472,185,483,175,505,173,546,140,554,137,548,132,529,144,503,166,483,168,468,179,449,183,434,192,423,208,410,222,372,239',
					'name' : 'Щелковское'
				}, 
              {
					'id' : 437,
					'coords' : '332,197,358,169,361,154,367,144,376,140,382,128,383,119,389,102,389,90,400,64,413,53,432,25,435,7,437,3,445,3,441,11,441,28,423,53,404,69,397,93,395,105,391,123,388,133,381,146,371,150,366,159,365,171,337,201',
					'name' : 'Ярославское'
				}
			];
		
			var roads = '';
			var list = '';
			for(i = 0; i < roads_coords.length; i++) {
				roads += "<area shape='poly' coords='" + roads_coords[i]['coords'] + "' rel='" + roads_coords[i]['id'] + "' href='#' alt='" + roads_coords[i]['name'] + "' />\n";
				list += "<a rel='" + roads_coords[i]['id'] + "' href='#'>" + roads_coords[i]['name'] + "</a>";
			}
			
			return "<div class='selected_roads'>"
						+ "<h5 class='roadheader'><a href='#' class='clear_all_road' id='" + options.prefix + "_clear_all_road'>очистить все</a>Выберите шоссе:</h5>"
						+ "<div class='item_list roadmaplist' id='" + options.prefix + "_ul_selected_road'>" + list + "</div>"
						+ "<input type='hidden' name='selected-roads' value='' id='" + options.prefix + "_form_road'>"
						+ "<a href='#' class='submit_road' id='" + options.prefix + "_submit_road' style='float: right; display: none'><span>Выбрать</span></a>"
						+ "<a href='#' class='cancel_road' id='" + options.prefix + "_cancel_road'>Отмена</a>"
					+ "</div>"
					+ "<h5 class='roadheader'>Выбор шоссе</h5>" 
					+ "<div class='small'>Выберите шоссе из списка или отметьте на карте</div>"
					+ "<div class='roadmapdiv' id='roaddiv_" + options.prefix + "'>"
						+ "<img src='/img/" + version + "/roads/map.gif' usemap='#Map' class='roadmapimg'>"
						+ "<map name='Map' id='Map'>"
						+ roads
						+ "</map>"
					+ "</div>";
		}
		
		function addStartId(){
			if(options.startId.length > 0) {
				set_roads(options.startId);
				
				for(i = 0; i < options.startId.length; i++){
					var id = options.startId[i];
					var div_id = "road_" + options.prefix + "_" + id;
					var el = $("area[rel='"+id+"']");
					var name = el.attr('alt');
					
					$('#' + options.prefix + '_ul_selected_road a[rel="' + id + '"]').addClass('selected');
					$('#roaddiv_' + options.prefix).prepend("<div class='road_img road_sprite road_" + id + "' rel='" + id + "' id='" + div_id + "'></div>");
				}
				killListenCloser();
			
				$('#' + options.prefix + '_submit_road').show();
			}
		}
		
		function getPrefix(min, max) {
			return Math.floor(Math.random() * (max - min + 1)) + min;
		}
		
		function closeMap() {
			popupbox.closePopup();
		}

		function scrollToForm(event) {
			if($(options.anchor).size() > 0) {
				var position = $(options.anchor).offset().top;
				var top = $(document).scrollTop();
				
				if(position < top){
					$('html, body').stop().animate({ scrollTop: position },0);
				}
			}
			event.preventDefault();
		}
		
		function killListen(){
			$('#' + options.prefix + '_clear_all_road').unbind('click');
			$('#' + options.prefix + '_cancel_road').unbind('click');
			$('#' + options.prefix + '_close_road').unbind('click');
			$('#' + options.prefix + '_submit_road').unbind('click');
			$('.station').unbind();
			killListenCloser();
		}
		
		function killListenCloser() {
			$('#' + options.prefix + '_ul_selected_road li .close_me').unbind('click');
		}
		
		function killRoad(id){
			$('#li_' + id).remove();
			var new_roads = remove_road(id, get_roads());
			$('#' + options.prefix + '_form_road').val(new_roads.join(','));
			$("#road_" + options.prefix + "_" + id).remove();
			$('#' + options.prefix + '_ul_selected_road a[rel="' + id + '"]').removeClass('selected');
			if(new_roads.length == 0){
				$('#' + options.prefix + '_submit_road').hide();
			}
		}
		
		function addRoad(id){
			roads = get_roads();
						
			if(!in_array(id, roads)){
				var name = $("area[rel='"+id+"']").attr('alt');
				$('#' + options.prefix + '_ul_selected_road a[rel="' + id + '"]').addClass('selected');
				roads[roads.length] = id;
				$('#' + options.prefix + '_form_road').val(roads.join(','));
				killListenCloser();
			}

			$('#' + options.prefix + '_submit_road').show();
		}
		
		function clearAndClose(event) {
			eval(options.callBack)(get_roads(), options.typename);
			closeMap();
			scrollToForm(event);
		}
		
		function listen() {
			$('#' + options.prefix + '_clear_all_road').click(function(event){
				$('#' + options.prefix + '_form_road').val('');
				$('#' + options.prefix + '_ul_selected_road a').removeClass('selected');
				$('#' + options.prefix + '_submit_road').hide();
				$('.road_img').remove();
				return false;
			});
			
			$('#' + options.prefix + '_close').click(function(event){
				closeMap();
				return false;
			});
			
			$('#' + options.prefix + '_cancel_road').click(function(event){
				clearAndClose(event);
				return false;
			});
			
			$('#' + options.prefix + '_submit_road').click(function(event){
				clearAndClose(event);
				return false;
			});		

			$('#roaddiv_' + options.prefix + ' map area').click(function(){
				selectRoad($(this).attr('rel'));
				return false;
			}).mouseover(function(e){
				$('body').append("<span class='roadTip' id='tip_" + $(this).attr('rel') + "'>" + $(this).attr('alt') + "</span>");
				$('#tip_' + $(this).attr('rel')).css({ left: parseInt(e.pageX + 10), top: parseInt(e.pageY - 20)});
			}).mouseout(function(){
				$('#tip_' + $(this).attr('rel')).remove();
			}).mousemove(function(e){
				$('#tip_' + $(this).attr('rel')).css({ left: parseInt(e.pageX + 10), top: parseInt(e.pageY - 20)})
			});
			
			$('#' + options.prefix + '_ul_selected_road a').click(function(){
				selectRoad($(this).attr('rel'));
				return false;
			});
		}
		
		function selectRoad(id){
			var div_id = "road_" + options.prefix + "_" + id;
			if($('#' + div_id).size() == 0) {
				$('#' + options.prefix + '_ul_selected_road a[rel="' + id + '"]').addClass('selected');
				$('#roaddiv_' + options.prefix).prepend("<div class='road_img road_sprite road_" + id + "' rel='" + id + "' id='" + div_id + "'></div>");
				addRoad(id);
			}else{
				$('#' + div_id).remove();
				$('#' + options.prefix + '_ul_selected_road a[rel="' + id + '"]').removeClass('selected');
				killRoad(id);
			}
		}
				
		function remove_road(id, arr){
			a = new Array;
			for(var i = 0, l = arr.length; i < l; i++)  {
				if(arr[i] != id) {
					a[a.length] = arr[i];
				}
			}
			return a;
		}
	};
})(jQuery);
