(function($) {
    function isRemoteUrl(url) {
	return /^http:\/\//.test(url) &&
	    location.href.indexOf(url.replace(/^(https?:\/\/[^\/]+)\/.*$/, '$1')) < 0;
    }

    function h(val) {
	return val.replace(/&/g, "&amp;")
	    .replace(/</g, "&lt;")
	    .replace(/>/g, "&gt;")
	    .replace(/\"/g, "&quot;")
	    .replace(/\'/g, "&#039;");
    }

    $.fn.loadFromRemoteJSON = function(url) {
	var self = this,
	base = url.replace(/^(https?:\/\/[^\/]+)\/.*$/, '$1'),
	utmSource = location.hostname,
	utmMedium = this.attr('data-utm-medium'),
	utmParams = ['term', 'content', 'campaign'];

	function addUtmToLink(match, url){
	    if(!utmMedium) {
		return match;
	    }
	    var params = "utm_source="+ utmSource + "&utm_medium="+ (utmMedium || "referral");
	    $.each(utmParams, function(i, val){
		    var attr = self.attr('data-utm-'+ val);
		    if(attr) {
			params+= "&utm_"+ val +"="+ encodeURIComponent(attr);
		    }
		});
	    return 'href="'+ h(url + (/\?/.test(url) ? "&" : "?" ) + params) +'"';;
	}
	function addUtmToForm(closeTag) {
	    if(!utmMedium) {
		return closeTag;
	    }
	    var medium = utmMedium || "form",
	    inputs = '<input type="hidden" name="utm_source" value="'+ h(utmSource) +'" />'+
	    '<input type="hidden" name="utm_medium" value="'+ h(medium) +'" />';
	    $.each(utmParams, function(i, val){
		    var attr = self.attr('data-utm-'+ val);
		    if(attr) {
			inputs += '<input type="hidden" name="utm_'+ h(val) +'" value="'+ h(attr) +'" />';
		    }
		});
	    return inputs + closeTag;
	}
	
	function updateHtml(data) {
	    self.html(data.
		      replace(/((?:href|action|src)=\")\//g, '$1'+ base + "/").
		      replace(/href="([^\"]+)"/g, addUtmToLink).
		      replace(/<\/form>/ig, addUtmToForm));
	}
	$.ajax({ url: url, dataType: 'jsonp', success: updateHtml });
    };

    $.fn.dynamicLoad = function(url) {
	if(isRemoteUrl(url)) {
	    this.loadFromRemoteJSON(url);
	} else {
	    this.load(url);
	}
    }
    //

DepartureModel
    .addObserver('initialized',
		 function() {
		     var deptId = DepartureModel.current();
		     $('.dynamic-loader').each(function(){
			     var elm = $(this);
			     var url = elm.attr('title');

			     if(url != "") {
				 url = url.replace(/departure_id=\d+/,
						   'departure_id='+ deptId);
				 elm.dynamicLoad(url);
				 elm.removeAttr('title');
			     }
			 });
		 });

DepartureModel
    .addObserver('changed', function(){
	    var dept = DepartureModel.currentName();
	    $('.dynamic-loader a.inner-link.selector-'+ dept).each(function() {
		    var loader = $(this);
		    loader.parents('.dynamic-loader').dynamicLoad(loader.attr('href'));
		});
	});
})(jQuery);

jQuery(function($) {
	$('.selector-tokyo').live('click', function(e) {
		e.preventDefault();
		DepartureModel.setByName('tokyo');
	    });
	$('.selector-osaka').live('click', function(e) {
		e.preventDefault();
		DepartureModel.setByName('osaka');
	    });
	$('.selector-nagoya').live('click', function(e) {
		e.preventDefault();
		DepartureModel.setByName('nagoya');
	    });
	$('.selector-haneda').live('click', function(e) {
		e.preventDefault();
		DepartureModel.setByName('haneda');
	    });
    });

