/*
 * media_href_replace.js
 *
 * @copyright 2008-2009 studio-m
 * @author    Ryo Miyake <ryo.studiom@gmail.com>
 * @version   1.4.0
 *
 * 1.0.0  2008/12/03  * First release.
 *
 * 1.1.0  2008/12/11  * Don't replace internal link with myCode.
 *                    * Export myCode other template file.
 *
 * 1.2.0  2009/01/15  * Modified codes class based.
 *                    * Add target 'area' elements under 'map'.
 *
 * 1.3.0  2009/04/21  * Inherit ignoreCodes in DJ domain.
 *
 * 1.4.0  2009/06/12  * Supported djDoamins more than one.
 */
var media = new MediaReplace();
media.ignoreCodes = [
    '100',
    '101',
    '102',
    '103',
    '104',
    '105',
    '201',
    '202',
    '203',
/*
 * list media code you don't want to.
 * for example '050', '051', ...
 */
];
media.djDomains = [
    'bewave.co.jp',
];
media.mySites = [
    'bewave.jp',
    'snowclub.jp',
    'skiguide.jp',
    'trekwalk.jp',
    'bewave.info',
    'otokubus.jp',
    'otokuski.jp',
/*
 * list yor sites.
 * these sites inherits media code.
 */
];

$(function() {
    media.getParams();
    if ( window.myCode ) {
        media.code = media.myCode = myCode;
    } else {
        media.myCode = '102';
    }
    // referrer check is only exists
    if ( document.referrer && media.params['MEDIA'] != undefined ) {
        if (
            media.isDJdomain(location.href) ||
            $.inArray(media.params['MEDIA'], media.ignoreCodes) == '-1'
        ) {
            media.code = media.params['MEDIA'];
        }
    }
    if ( !media.code ) return;

    // search anchor elements
    $('a[href]').not('[href^="javascript"]').not('[href^="#"]').not('[href^="mailto:"]').each(function() {
        var url = $(this).attr('href');
        $(this).attr('href', media.replaceURL(url));
    } );

    // search map area elements
    $('map area').each(function() {
        var url = $(this).attr('href');
        $(this).attr('href', media.replaceURL(url));
    } );

    // search form elements
    $('form[method="get"]').each(function() {
        // don't overwrite MEDIA param
        if ( !$(this).find('input[name="MEDIA"]').get(0) ) {
            // ignore external link
            if ( media.isTarget($(this).attr('action'), media.code) == 0 ) return;

            // insert MEDIA param
            $(this).prepend('<input type="hidden" name="MEDIA" value="'+media.code+'">');
        }
    } );
});

function MediaReplace() {
    this.myCode = null;
    this.code = null;
    this.params = null;

    this.getParams = function() {
        var params = [];
        var querystrings = window.location.search.substr(1).split('&');
        for ( var i in querystrings ) {
            var param = querystrings[i].split('=');
            params[param[0]] = param[1];
        }
        this.params = params;
        return params;
    }

    this.isTarget = function(url, code) {
        // when exists inherit code, internal link is always target
        if ( !url.match(/^[a-zA-Z]+:/) ) {
            return ( code === this.myCode ) ? 0 : 1;
        }

        // dj link is always target
        if ( this.isDJdomain(url) ) return 1;

        // mysites only inherit extra codes
        for ( var i in this.mySites ) {
            var domain = new RegExp('^(http|https)://[a-zA-Z0-9\-_]+\.' + this.mySites[i]);
            if ( url.match(domain) && $.inArray(code, this.ignoreCodes) == '-1' ) return 1;
        }
        return 0;
    }

    this.replaceURL = function(url) {
        // don't overwrite MEDIA param
        if ( url.match(/MEDIA=/) ) return;

        // ignore external link
        if ( this.isTarget(url, this.code) == 0 ) return;

        // push flagment
        var flagment = url.match(/#\w+$/);
        if ( flagment ) {
            url = url.replace(/#\w+$/, '');
        }

        // set MEDIA param
        if ( !url.match(/MEDIA=/) ) {
            url += (!url.match(/\?/)) ? '?' : (!url.match(/\?$/)) ? '&' : '';
            url += 'MEDIA='+this.code;
        }

        // pop flagment
        if ( flagment ) url += flagment;

        return url;
    }

    this.isDJdomain = function(url) {
        for ( var i = 0; i <= this.djDomains.length; i++ ) {
            var reg = new RegExp('^(http|https)://' + this.djDomains[i] + '/');
            if (url.match(reg)) { return 1; }
        }
        return 0;
    }

    this.redirect = function(url) {
        if ( this.isDJdomain(url) || this.code != myCode ) {
            url += '&MEDIA=' + this.code;
        }
        location.href = url;
    }

}

