/*
 * adv_code_store.js
 *
 * @copyright 2010 studio-m
 * @author    Ryo Miyake <ryo.studiom@gmail.com>
 * @version   1.2.2
 *
 * 1.2.2  2010/03/01  * fixed problem: resolved conflict Twitter Widget
 * 1.2.1  2010/02/17  * fixed problem: error occured by null url in IE
 * 1.2.0  2010/02/04  * djURLs match regardless of upper/lower case
 *
 * 1.1.1  2010/02/02  * fixed problem: remove debug code
 * 1.1.0  2010/02/01  * referrer code don't overwrite url code
 *
 * 1.0.0  2010/01/26  * First release.
 */
var advCodeStore = function() {
    var cookieName   = 'storeAdv';
    //var cookieExpire = 30;
    var cookieExpire = 1 * 24 * 3600;
    var djURLs = [
        'wbf.co.jp',
		'shirokumaski.com',
        'oka-ch.com',
        'bali-ch.com',
        '5489net.com',
        'gtravel-e.com',
        'ishigakiryokou.com',
        'geotour.jp',
        'geoski.jp',
        'oceanus-dive.jp',
        'wbf-nagoya.jp'
    ];
    var referrerCodes = {
		//'http://www.rasso.co.jp/' : 'ras',
        //'http://www.shirokumaski.com/' : 'ski',
        //'http://search.yahoo.co.jp/' : 's01',
        //'http://www.google.co.jp/'   : 's02'
    };

    /**
     * getParams - parse query strings
     *
     * @return array params
     */
    var getParams = function() {
        var params = [];
        var querystrings = window.location.search.substr(1).split('&');
        for (var i=0; i<querystrings.length; i++) {
            var param = querystrings[i].split('=');
            params[param[0]] = param[1];
        }
        return params;
    };

    /**
     * save - save cookie
     *
     * @return object cookie data
     */
    var save = function(code, type) {
        if ( !code ) { return; }
        type = type || 'param';
        var date = new Date();
        var expire = cookieExpire || 8 * 3600;
        date.setTime(date.getTime() + (expire * 1000));
        var value = code + '<>' + type;
        $.cookie(cookieName, value, { path: '/', expires: date });
        return { code: code, type: type };
    };

    /**
     * load - load cookie
     *
     * @return null|object cookie data
     */
    var load = function() {
        var value  = $.cookie(cookieName);
        var values = value ? value.split('<>') : [];
        return { code: values[0], type: values[1] };
    };

    /**
     * getReferrerCode - get code defined to referrer URL
     *
     * @param  string url
     * @return string|null code
     */
    var getReferrerCode = function(url) {
        if ( !url ) { return; }
        for (var key in referrerCodes) {
            var reg = new RegExp('^' + key);
            if ( url.match(reg) ) {
                return referrerCodes[key];
            }
        }
    };

    /**
     * isDJURL - is DJ URL ?
     *
     * @param  string url
     * @return bool   url is DJ URL or not
     */
    var isDJURL = function(url) {
        if ( !url ) { return false; }
        for ( var i = 0; i < djURLs.length; i++ ) {
            var reg = new RegExp(djURLs[i], 'i');
            if ( url.match(reg) ) { return true; }
        }
        return false;
    };

    /**
     * isTargetURL
     *
     * @param  string url
     * @return bool   url is target or not
     */
    var isTargetURL = function(url) {
        if ( !url ) { return false; }

        // replace only DJ URL
        if ( !isDJURL(url) ) { return false; }

        // don't overwrite adv param
        if ( url.match(/(\?|\&)adv=/) ) { return false; }

        return true;
    };

    /**
     * replaceURL
     *
     * @param  string url
     * @param  string code
     * @return string replaced url
     */
    var replaceURL = function(url, code) {
        if ( !isTargetURL(url) || !code ) { return url; }

        // push flagment
        var flagment = url.match(/#\w+$/);
        if ( flagment ) {
            url = url.replace(/#\w+$/, '');
        }

        // set adv param
        url += (!url.match(/\?/)) ? '?' : (!url.match(/\?$/)) ? '&' : '';
        url += 'adv='+code;

        // pop flagment
        if ( flagment ) { url += flagment; }

        return url;
    };

    /**
     * replaceTargets
     *
     * @param  string code
     * @param  jquery base
     * @return null
     */
    var replaceTargets = function(code, base) {
        base = base || $(document);
        // search anchor elements
        $('a[href]', base).not('[href^="javascript"]').not('[href^="#"]').not('[href^="mailto:"]').each(function() {
            var url = $(this).attr('href');
            if ( isTargetURL(url) ) {
                $(this).attr('href', replaceURL(url, code));
            }
        } );

        // search map area elements
        $('map area', base).each(function() {
            var url = $(this).attr('href');
            if ( isTargetURL(url) ) {
                $(this).attr('href', replaceURL(url, code));
            }
        } );

        // search form elements
        $('form[method="get"]', base).each(function() {
            // don't overwrite MEDIA param
            if ( !$(this).find('input[name="adv"]').get(0) ) {
                if ( isTargetURL($(this).attr('action')) ) {
                    $(this).prepend('<input type="hidden" name="adv" value="' + code + '">');
                }
            }
        } );
    };

    /**
     * getSuitableCode
     *
     * @return object cookie data
     */
    var getSuitableCode = function() {
        var params = getParams();
        if ( params.adv ) {
            return save(params.adv);
        }
        var data = load();
        if ( data.type !== 'param' ) {
            var code = getReferrerCode(document.referrer);
            if ( code ) {
                return save(code, 'referrer');
            }
        }
        return data;
    };

    /**
     * run
     *
     * @return object cookie data
     */
    var run = function() {
        var data = getSuitableCode();
        if ( data.code ) {
            replaceTargets(data.code);
        }
        return data;
    };

    return {
        isTargetURL: isTargetURL,
        replaceURL: replaceURL,
        replaceTargets: replaceTargets,
        getSuitableCode: getSuitableCode,
        run: run
    };
};

