Edit in JSFiddle

/*
Copyright 2012 KAKAO
*/

var KAKAO = (function () {

    var KAKAO = {

        Talk: {
            os: getOS(),
            name: 'talk',
            link: talkLink

        },

        Story: {
            os: getOS(),
            name: 'story',
            link: storyLink

        },
    }


    function talkLink(msg, url, appName, metaInfo, appId) {

        msg = msg || '';
        url = url || '';
        appName = appName || top.location.host;
        appId = appId || top.location.host;

        var strMetaInfo = JSON.stringify(metaInfo);

        var params = '';
        if (metaInfo && typeof metaInfo === 'object') {
            params = getSerialized({
                msg: msg,
                url: url,
                appid: appId,
                apiver: AppInfo[this.name || ''].apiver,
                appname: appName,
                metainfo: strMetaInfo
            });
        }
        else {
            params = getSerialized({
                msg: msg,
                url: url,
                appid: appId,
                apiver: AppInfo[this.name || ''].apiver,                
                appname: appName
            });
        }

        url = AppInfo[this.name || ''].baseUrl + params;

        var self = this;
        if (this.os === 'ios') {

            var timer = setTimeout(function () {

                installBlockCallback(self.name, self.os);
                clearTimeout(timer);

            }, 35);

            top.location.href = url;

        }
        else if (this.os === 'android') {

            var ifm = document.createElement('iframe');
            ifm.style.visibility = 'hidden';
            ifm.src = url;
            ifm.onload = function () { installBlockCallback(self.name, self.os); }

            var doc = document.documentElement || document.body;

            doc.appendChild(ifm);
        }

        return this;
    }


    function storyLink(post, appName, urlInfo, appId) {

        post = post || '';
        appName = appName || top.location.host; 
        appId = appId || top.location.host;

        var strUrlInfo = JSON.stringify(urlInfo);

        var params = '';
        if (urlInfo && typeof urlInfo === 'object') {
            params = getSerialized({
                post: post,
                appid: appId,
                appver: '1.0',
                apiver: AppInfo[this.name || ''].apiver,
                appname: appName,
                urlinfo: strUrlInfo
            });
        }
        else {
            params = getSerialized({
                post: post,
                appid: appId,
                appver: '1.0',
                apiver: AppInfo[this.name || ''].apiver,
                appname: appName
            });
        }

        url = AppInfo[this.name || ''].baseUrl + params;

        var self = this;
        if (this.os === 'ios') {

            var timer = setTimeout(function () {

                installBlockCallback(self.name, self.os);
                clearTimeout(timer);

            }, 35);

            top.location.href = url;

        }
        else if (this.os === 'android') {

            var ifm = document.createElement('iframe');
            ifm.style.visibility = 'hidden';
            ifm.src = url;
            ifm.onload = function () { installBlockCallback(self.name, self.os); }

            var doc = document.documentElement || document.body;

            doc.appendChild(ifm);
        }

        return this;
    }    

    function installBlockCallback(name, os) {

        name = name || '';
        os = os || '';

        try {
            var store = AppInfo[name].store[os];
            top.location.href = store;
        }
        catch (e) { }
    }

    function getSerialized(params) {

        params = params || {};

        var ret = [];
        for (var n in params) {
            if (params[n]) ret.push(n + '=' + encodeURIComponent(params[n]));
            //if (params[n]) ret.push(n + '=' + params[n]);
        }

        return ret.join('&') || [];
    }

    // 해당 모바일 디바이스 타입 반환
    function getOS() {

        var ua = window.navigator.userAgent.toLowerCase();

        return ua.indexOf('iphone') > -1 || ua.indexOf('ipod') > -1 || ua.indexOf('ipad') > -1 ? 'ios' : ua.indexOf('android') > -1 ? 'android' : '';
    }

    var AppInfo = {

        talk: {
            baseUrl: 'kakaolink://sendurl?',
            store: {
                android: 'market://details?id=com.kakao.talk',
                ios: 'http://itunes.apple.com/app/id362057947'
            },  
            apiver: '1.0'
        },
        story: {
            baseUrl: 'storylink://posting?',
            store: {    
                android: 'market://details?id=com.kakao.story',
                ios: 'http://itunes.apple.com/app/id486244601'
            },
            apiver: '1.0'
        }
    };

    return KAKAO;
    
} ());