/*
 * Generate a random uuid.
 *
 * USAGE: Math.uuid(length, radix)
 *   length - the desired number of characters
 *   radix  - the number of allowable values for each character.
 *
 * EXAMPLES:
 *   // No arguments  - returns RFC4122, version 4 ID
 *   >>> Math.uuid()
 *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
 *
 *   // One argument - returns ID of the specified length
 *   >>> Math.uuid(15)     // 15 character ID (default base=62)
 *   "VcydxgltxrVZSTV"
 *
 *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
 *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
 *   "01001010"
 *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
 *   "47473046"
 *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
 *   "098F4D35"
 */
Math.uuid = (function() {
  // Private array of chars to use
  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');

  return function (len, radix) {
    var chars = CHARS, uuid = [], rnd = Math.random;
    radix = radix || chars.length;

    if (len) {
      // Compact form
      for (var i = 0; i < len; i++) uuid[i] = chars[0 | rnd()*radix];
    } else {
      // rfc4122, version 4 form
      var r;

      // rfc4122 requires these characters
      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '';
      uuid[14] = '4';

      // Fill in random data.  At i==19 set the high bits of clock sequence as
      // per rfc4122, sec. 4.1.5
      for (var i = 0; i < 36; i++) {
        if (!uuid[i]) {
          r = 0 | rnd()*16;
          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
        }
      }
    }

    var ret = uuid.join('');
    return ret.substring(0, 32);
  };
})();


function urlencode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // +      input by: Ratheous
    // %          note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'

    var hash_map = {}, unicodeStr='', hexEscStr='';
    var ret = (str+'').toString();

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The hash_map is identical to the one in urldecode.
    hash_map["'"]   = '%27';
    hash_map['(']   = '%28';
    hash_map[')']   = '%29';
    hash_map['*']   = '%2A';
    hash_map['~']   = '%7E';
    hash_map['!']   = '%21';
    hash_map['%20'] = '+';
    hash_map['\u00DC'] = '%DC';
    hash_map['\u00FC'] = '%FC';
    hash_map['\u00C4'] = '%D4';
    hash_map['\u00E4'] = '%E4';
    hash_map['\u00D6'] = '%D6';
    hash_map['\u00F6'] = '%F6';
    hash_map['\u00DF'] = '%DF';
    hash_map['\u20AC'] = '%80';
    hash_map['\u0081'] = '%81';
    hash_map['\u201A'] = '%82';
    hash_map['\u0192'] = '%83';
    hash_map['\u201E'] = '%84';
    hash_map['\u2026'] = '%85';
    hash_map['\u2020'] = '%86';
    hash_map['\u2021'] = '%87';
    hash_map['\u02C6'] = '%88';
    hash_map['\u2030'] = '%89';
    hash_map['\u0160'] = '%8A';
    hash_map['\u2039'] = '%8B';
    hash_map['\u0152'] = '%8C';
    hash_map['\u008D'] = '%8D';
    hash_map['\u017D'] = '%8E';
    hash_map['\u008F'] = '%8F';
    hash_map['\u0090'] = '%90';
    hash_map['\u2018'] = '%91';
    hash_map['\u2019'] = '%92';
    hash_map['\u201C'] = '%93';
    hash_map['\u201D'] = '%94';
    hash_map['\u2022'] = '%95';
    hash_map['\u2013'] = '%96';
    hash_map['\u2014'] = '%97';
    hash_map['\u02DC'] = '%98';
    hash_map['\u2122'] = '%99';
    hash_map['\u0161'] = '%9A';
    hash_map['\u203A'] = '%9B';
    hash_map['\u0153'] = '%9C';
    hash_map['\u009D'] = '%9D';
    hash_map['\u017E'] = '%9E';
    hash_map['\u0178'] = '%9F';

    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);

    for (unicodeStr in hash_map) {
        hexEscStr = hash_map[unicodeStr];
        ret = replacer(unicodeStr, hexEscStr, ret); // Custom replace. No regexing
    }

    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
}

function http_build_query( formdata, numeric_prefix, arg_separator ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Legaev Andrey
    // +   improved by: Michael White (http://getsprink.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: stag019
    // -    depends on: urlencode
    // *     example 1: http_build_query({foo: 'bar', php: 'hypertext processor', baz: 'boom', cow: 'milk'}, '', '&amp;');
    // *     returns 1: 'foo=bar&amp;php=hypertext+processor&amp;baz=boom&amp;cow=milk'
    // *     example 2: http_build_query({'php': 'hypertext processor', 0: 'foo', 1: 'bar', 2: 'baz', 3: 'boom', 'cow': 'milk'}, 'myvar_');
    // *     returns 2: 'php=hypertext+processor&myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk'

    var value, key, tmp = [];

    var _http_build_query_helper = function (key, val, arg_separator) {
        var k, tmp = [];
        if (val === true) {
            val = "1";
        } else if (val === false) {
            val = "0";
        }
        if (typeof(val) == "array" || typeof(val) == "object") {
            for (k in val) {
                if(val[k] !== null) {
                    tmp.push(_http_build_query_helper(key + "[" + k + "]", val[k], arg_separator));
                }
            }
            return tmp.join(arg_separator);
        } else if(typeof(val) != "function") {
	  if(val != undefined)
	    return urlencode(key) + "=" + urlencode(val);
	  else
	    return undefined;
        }
    };

    if (!arg_separator) {
        arg_separator = "&";
    }
    for (key in formdata) {
        value = formdata[key];
        if (numeric_prefix && !isNaN(key)) {
            key = String(numeric_prefix) + key;
        }
	var key_val_str = _http_build_query_helper(key, value, arg_separator);
	if(key_val_str != undefined)
	  tmp.push(key_val_str);
    }

    return tmp.join(arg_separator);
}

function kt_getCookie(c_name)
{
  if (document.cookie.length>0)
  {
    var c_start=document.cookie.indexOf(c_name + "=");
    if (c_start!=-1)
    {
      c_start = c_start + c_name.length+1;
      var c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1) c_end=document.cookie.length;
      return unescape(document.cookie.substring(c_start,c_end).replace(/\+/g, ' '));
    }
  }
  return "";
}

function gen_stream_link(link, uuid, st1, st2)
{
  var param_array = {'kt_type' : 'stream',
		     'kt_ut'   : String(uuid)};
  if(st1 != undefined)
  {
    param_array['kt_st1'] = st1;
  }
  if(st2 != undefined)
  {
    param_array['kt_st2'] = st2;
  }
  var query_str = http_build_query(param_array);
  var mod_link = append_kt_query_str(link, query_str);
  return mod_link;
}

var kt_feed_cookie_prefix  = 'KT_FEED_AB_TEST_INFO';

function gen_stream_link_vo(link, uuid, campaign)
{
  // check out cache_ab_testing_msg_page_tuplein kt_ab_testing.php to see how data is being stored in cookies
  // {'data' : page_msg_info,
  //  'handle_index': handle_index}
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  var param_array = { 'kt_type' : 'stream',
		      'kt_ut': String(uuid) };

  param_array['kt_st1'] = format_kt_st1(campaign, abtest_data['handle_index']);
  // For feeds, messages and pages are tightly coupled
  param_array['kt_st2'] = format_kt_st2(abtest_data['data'][0]);
  param_array['kt_st3'] = format_kt_st3(abtest_data['data'][0]);

  var query_str = http_build_query(param_array);
  var mod_link = append_kt_query_str(link, query_str);
  return mod_link;
}

function gen_feedstory_link(link, uuid, st1, st2)
{
  var param_array = {'kt_type' : 'feedstory',
		     'kt_ut'  : String(uuid) };
  if( st1 != undefined)
  {
    param_array['kt_st1'] = st1;
  }
  if( st2 != undefined)
  {
    param_array['kt_st2'] = st2;
  }
  var query_str = http_build_query(param_array);

  var mod_link = append_kt_query_str(link, query_str);
  return mod_link;
}

function gen_feedstory_link_vo(link, uuid, campaign)
{
  // check out cache_ab_testing_msg_page_tuplein kt_ab_testing.php to see how data is being stored in cookies
  // {'data' : page_msg_info,
  //  'handle_index': handle_index}
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  var param_array = { 'kt_type' : 'feedstory',
		      'kt_ut': String(uuid) };

  param_array['kt_st1'] = format_kt_st1(campaign, abtest_data['handle_index']);
  // For feeds, messages and pages are tightly coupled
  param_array['kt_st2'] = format_kt_st2(abtest_data['data'][0]);
  param_array['kt_st3'] = format_kt_st3(abtest_data['data'][0]);

  var query_str = http_build_query(param_array);
  var mod_link = append_kt_query_str(link, query_str);
  return mod_link;
}

function get_selected_stream_msg(campaign, data_assoc_array)
{
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  var r =  replace_vo_custom_variable(abtest_data['data'][3], data_assoc_array);
  return r;
}

function get_selected_stream_call_to_action(campaign, data_assoc_array)
{
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  return replace_vo_custom_variable(abtest_data['data'][2], data_assoc_array);
}

function format_kt_st1(st1_str, handle_index)
{
  return 'aB_'+st1_str+"___"+handle_index;
}

function format_kt_st2(st2_str)
{
  return 'm'+st2_str;
}

function format_kt_st3(st3_str)
{
  return 'p'+st3_str;
}

function get_selected_feed_msg(campaign, data_assoc_array)
{
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  return replace_vo_custom_variable(abtest_data['data'][3], data_assoc_array);
}

function get_selected_feed_call_to_action(campaign, data_assoc_array)
{
  var abtest_data = JSON.parse(kt_getCookie(kt_feed_cookie_prefix+campaign));
  return replace_vo_custom_variable(abtest_data['data'][2], data_assoc_array);
}

var AB_TEMPLATE_REGEX = /\{\{(.*?)\}\}/g;
var KEY_REGEX = /\{\{(.*?)\}\}/;
function replace_vo_custom_variable(text, data_assoc_array)
{
  var variable_list = text.match(AB_TEMPLATE_REGEX);
  if(variable_list == null) return text; //no variables

  var len = variable_list.length;
  for(var i = 0; i < len; i++)
  {
    var var_name = variable_list[i];
    var key = var_name.match(KEY_REGEX)[1];
    text = text.replace(var_name, data_assoc_array[key]);
  }
  return text;
}

function append_kt_query_str(original_url, query_str)
{
  var position = original_url.indexOf('?');
  if(position == -1)
  {
    return original_url + "?" + query_str;
  }
  else
  {
    return original_url + "&" + query_str;
  }
}


function parse_str(query_str){
  var r = {};
  if(query_str == undefined || query_str == "")
    return r;

  var key_val_pair_list = query_str.split('&');
  var key_val_pair_list_len = key_val_pair_list.length;
  for(var i = 0 ; i < key_val_pair_list_len; i++)
  {
    var key_val_pair = key_val_pair_list[i];
    var item = key_val_pair.split("=");
    if(item[1] == undefined || item[1] =="")
    {
      r[item[0]] = null;
    }
    else
    {
      r[item[0]] = decodeURIComponent(item[1].replace(/\+/g, '%20'));
    }
  }
  return r;
}

function KT(){
  //TODO: SHOULD LOOK AT BEAR'S coode
  this.api_host = 'http://api.test.kontagent.net';
  this.version = 'v1';
  this.kt_api_key = '1111';
};

KT.prototype = {
  _gen_link : function(channel, data)
  {
    var qs = http_build_query(data);
    var url_path = this.api_host + "/" + this.version + "/" + this.kt_api_key + "/" + channel + "/?" + qs;
    return url_path;
  },

  save_stream_click : function(_GET)
  {
    var data = { r   : 'RECIPIENT_ID',
		 i   : 1,
		 u   : _GET['kt_ut'],
		 tu  : 'stream',
		 st1 : _GET['kt_st1'],
		 st2 : _GET['kt_st2'],
		 st3 : _GET['kt_st3']
	       };

    var kt_url = this._gen_link('psr', data);
    //TODO: call bear's KtOutboundMsg()
    // KT.prototype.bar = foo;
    //this.ktOutboundMsg();
  },

  save_invite_click : function()
  {

  }

};
