var nl = "\n";
var ads       = [];
var keywords  = [];

var _kw_list       = [];
var _kw_expansions = [];

var _broad_match   = false;
var _phrase_match  = false;
var _exact_match   = false;

var _campaign      = "";
var _ad_group_name = "";
var _ad_group_yahoo_bid = "";
var _ad_group_url = "";

var _msn_broad   = "";
var _msn_exact   = "";
var _msn_phrase  = "";
var _msn_content = "";

var _use_this_variation      = false;
var _wrong_keys              = false;
var _missed_characters       = false;
var _transposed_characters   = false;
var _double_characters       = false;
var _conncected_no_spaces    = false;
var _connected_by_hyphens    = false;
var _connected_by_plus_signs = false;
var _connected_by_dots       = false;

var _ad1_title   = "";
var _ad1_line1   = "";
var _ad1_line2   = "";
var _ad1_dispurl = "";
var _ad1_desturl = "";

var _ad2_title   = "";
var _ad2_line1   = "";
var _ad2_line2   = "";
var _ad2_dispurl = "";
var _ad2_desturl = "";

var _do_adwords = false;
var _do_yahoo   = false;
var _do_msn     = false;

function keyword(campaign, adgroup, text, match_type) {
    this.campaign   = campaign;
    this.adgroup    = _ad_group_name + ' ' + adgroup;
    this.text       = text;
    this.match_type = match_type;
}

function ad(campaign, adgroup, title, line1, line2, dispurl, desturl) {
    this.campaign   = campaign;
    this.adgroup    = _ad_group_name + ' ' + adgroup;
    this.title      = title;
    this.line1      = line1;
    this.line2      = line2;
    this.dispurl    = dispurl;
    this.desturl    = desturl;
}

var wrong_keys = {
    '1' : ['2','w','q'],
    '2' : ['1','3','e','w','q'],
    '3' : ['2','4','r','e','w'],
    '4' : ['3','5','t','r','e'],
    '5' : ['4','6','y','t','r'],
    '6' : ['5','7','u','y','t'],
    '7' : ['6','8','i','u','y'],
    '8' : ['7','9','o','i','u'],
    '9' : ['8','0','p','o','i'],
    '0' : ['9','p','o'],
    'q' : ['1','2','w','s','a'],
    'w' : ['1','2','3','e','d','s','a','q'],
    'e' : ['2','3','4','r','f','d','s','w'],
    'r' : ['3','4','5','t','g','f','d','e'],
    't' : ['4','5','6','y','h','g','f','r'],
    'y' : ['5','6','7','u','j','h','g','t'],
    'u' : ['6','7','8','i','k','j','h','y'],
    'i' : ['7','8','9','o','l','k','j','u'],
    'o' : ['8','9','0','p','l','k','i'],
    'p' : ['9','0','l','o'],
    'a' : ['q','w','s','x','z'],
    's' : ['q','w','e','d','c','x','z','a'],
    'd' : ['w','e','r','f','v','c','x','s'],
    'f' : ['e','r','t','g','b','v','c','d'],
    'g' : ['r','t','y','h','n','b','v','f'],
    'h' : ['t','y','u','j','m','n','b','g'],
    'j' : ['y','u','i','k','m','n','h'],
    'k' : ['u','i','o','l','m','j'],
    'l' : ['i','o','p','l','k'],
    'z' : ['a','s','x'],
    'x' : ['a','s','d','c','z'],
    'c' : ['s','d','f','v','x'],
    'v' : ['d','f','g','b','c'],
    'b' : ['f','g','h','n','v'],
    'n' : ['g','h','j','m','b'],
    'm' : ['h','j','k','n']    
}

function edit_ad_line(input_obj, char_obj, disp_obj, default_text) {    

    var charCount = char_obj.text().split('/')[1] * 1;
    var str = input_obj.val();
    
    if (str.length > charCount) {
        char_obj.html('<span class="too-long">'+str.length+'</span>/'+charCount);
    }
    else {
        char_obj.html(str.length+'/'+charCount);
    }
    
    if (str == "") str = default_text;    
    disp_obj.html(str);    

}

function everything_is_ok() {
    
    // see if we have any keywords
    _kw_list = [];
    var tmp = $("#ad_group_keywords").val().split("\n");
        
    for (i in tmp) {
        if (!tmp[i].match(/^\s*$/)) {
            _kw_list.push(tmp[i]);
        }
    }
        
    if (_kw_list.length == 0) {
        $("#ad_group_keywords").focus();
        return false;
    }
    
    // see if we have any kw expansions
    _kw_expansions = [];
    tmp = $("#keyword_expansions").val().split("\n");

    for (i in tmp) {
        if (!tmp[i].match(/^\s*$/)) {
            _kw_expansions.push(tmp[i]);
        }
    }
    
    if (_kw_expansions.length == 0) {
        $("#keyword_expansions").focus();
        return false;
    }
    
    // we should have at least one match type selected
    _broad_match = $("#broad_match").is(":checked");
    _phrase_match = $("#phrase_match").is(":checked");
    _exact_match = $("#exact_match").is(":checked");
    
    if (!_broad_match && !_phrase_match && !_exact_match) {
        alert("You should choose at least one match type");
        return false;
    }
    
    _campaign      = $("#campaign_name").val(); // do we need validation here?
    _ad_group_name = $("#ad_group_name").val();
    _ad_group_yahoo_bid = $("#_ad_group_yahoo_bid").val();
    _ad_group_url = $("#ad_group_url").val();

    _msn_broad   = $("#ad_group_msn_broad").val();
    _msn_exact   = $("#ad_group_msn_exact").val();
    _msn_phrase  = $("#ad_group_msn_phrase").val();
    _msn_content = $("#ad_group_msn_content").val();
    
    _use_this_variation      = $("#this_variation").is(":checked");
    _wrong_keys              = $("#wrong_keys").is(":checked");
    _missed_characters       = $("#missed_characters").is(":checked");
    _transposed_characters   = $("#transposed_characters").is(":checked");
    _double_characters       = $("#double_characters").is(":checked");
    _conncected_no_spaces    = $("#connected_no_spaces").is(":checked");
    _connected_by_hyphens    = $("#connected_by_hyphens").is(":checked");
    _connected_by_plus_signs = $("#connected_by_plus_signs").is(":checked");
    _connected_by_dots       = $("#connected_by_dots").is(":checked");
    
    _ad1_title   = $("#ad1_title").val();
    _ad1_line1   = $("#ad1_line1").val();
    _ad1_line2   = $("#ad1_line2").val();
    _ad1_dispurl = $("#ad1_display_url").val();
    _ad1_desturl = $("#ad1_destination_url").val();

    _ad2_title   = $("#ad2_title").val();
    _ad2_line1   = $("#ad2_line1").val();
    _ad2_line2   = $("#ad2_line2").val();
    _ad2_dispurl = $("#ad2_display_url").val();
    _ad2_desturl = $("#ad2_destination_url").val();
    
    _do_adwords = $("#generate_adwords").is(":checked");
    _do_yahoo   = $("#generate_yahoo").is(":checked");
    _do_msn     = $("#generate_msn").is(":checked");
    
    if (!_do_adwords && !_do_yahoo && !_do_msn) {
        alert('Select at least one ouput target (Adwords, Yahoo, MSN)');
        return false;
    }

    $("#adwords_keywords").val("");
    $("#adwords_ads").val("");
    $("#yahoo_search_marketing").val("");
    $("#msn_keywords").val("");
    $("#msn_ads").val("");
    
    return true;    
}

function generate_keywords() {
    keywords = [];
    
    for (var i in _kw_list) {
        var ad_group = _kw_list[i];
        
        for (var j in _kw_expansions) {
            var kw = _kw_expansions[j];
            if (kw.match(/\bkwd\b/)) {
                kw = kw.replace(/\bkwd\b/,ad_group);
            }
            
            if (_broad_match && _use_this_variation) {
                var k = new keyword(_campaign, ad_group, kw,"Broad");
                keywords.push(k);
            }

            if (_phrase_match && _use_this_variation) {
                var k = new keyword(_campaign, ad_group, kw,"Phrase");
                keywords.push(k);
            }

            if (_exact_match && _use_this_variation) {
                var k = new keyword(_campaign, ad_group, kw,"Exact");
                keywords.push(k);
            }
            
            if (_wrong_keys) {
                generate_wrong_keys(ad_group, kw);
            }
            
            if (_missed_characters) {
                generate_missed_characters(ad_group, kw);
            }
            
            if (_transposed_characters) {
                generate_transposed_characters(ad_group, kw);
            }
            
            if (_double_characters) {
                generate_double_characters(ad_group, kw);
            }
            
            if (_conncected_no_spaces && kw.match(/ /)) {
                var new_kw = kw.replace(/ /g,'');
                if (_broad_match) { keywords.push( new keyword(_campaign, "C NO S: " + ad_group, new_kw,"Broad") ); }
                if (_exact_match) { keywords.push( new keyword(_campaign, "C NO S: " + ad_group, new_kw,"Exact") ); }
                if (_phrase_match) { keywords.push( new keyword(_campaign, "C NO S: " + ad_group, new_kw,"Phrase") ); }                
            }

            if (_connected_by_hyphens && kw.match(/ /)) {
                var new_kw = kw.replace(/ /g,'-');
                if (_broad_match) { keywords.push( new keyword(_campaign, "CONN M: " + ad_group, new_kw,"Broad") ); }
                if (_exact_match) { keywords.push( new keyword(_campaign, "CONN M: " + ad_group, new_kw,"Exact") ); }
                if (_phrase_match) { keywords.push( new keyword(_campaign, "CONN M: " + ad_group, new_kw,"Phrase") ); }                
            }

            if (_connected_by_plus_signs && kw.match(/ /)) {
                var new_kw = kw.replace(/ /g,'+');
                if (_broad_match) { keywords.push( new keyword(_campaign, "CONN P: " + ad_group, new_kw,"Broad") ); }
                if (_exact_match) { keywords.push( new keyword(_campaign, "CONN P: " + ad_group, new_kw,"Exact") ); }
                if (_phrase_match) { keywords.push( new keyword(_campaign, "CONN P: " + ad_group, new_kw,"Phrase") ); }                
            }
            
            if (_connected_by_dots && kw.match(/ /)) {
                var new_kw = kw.replace(/ /g,'.');
                if (_broad_match) { keywords.push( new keyword(_campaign, "CONN D: " + ad_group, new_kw,"Broad") ); }
                if (_exact_match) { keywords.push( new keyword(_campaign, "CONN D: " + ad_group, new_kw,"Exact") ); }
                if (_phrase_match) { keywords.push( new keyword(_campaign, "CONN D: " + ad_group, new_kw,"Phrase") ); }                
            }
            
        }
    }    
}

function generate_wrong_keys(ad_group, kw) {

    for (var i = 0; i < kw.length; i++) { 
        var ch = kw.charAt(i);
        if (wrong_keys[ch]) {
            var reps = wrong_keys[ch];
            for (var j in reps) {
                var new_kw = kw.substr(0,i)+reps[j]+kw.substr(i+1);
                if (_broad_match) { keywords.push( new keyword(_campaign, "WK: " + ad_group, new_kw,"Broad") ); }
                if (_exact_match) { keywords.push( new keyword(_campaign, "WK: " + ad_group, new_kw,"Exact") ); }
                if (_phrase_match) { keywords.push( new keyword(_campaign, "WK: " + ad_group, new_kw,"Phrase") ); }
            }
        }
    }
}

function generate_missed_characters(ad_group, kw) {
    for (var i = 0; i < kw.length; i++) {
        var new_kw = kw.substr(0,i)+kw.substr(i+1);
        if (_broad_match) { keywords.push( new keyword(_campaign, "MC: " + ad_group, new_kw,"Broad") ); }
        if (_exact_match) { keywords.push( new keyword(_campaign, "MC: " + ad_group, new_kw,"Exact") ); }
        if (_phrase_match) { keywords.push( new keyword(_campaign, "MC: " + ad_group, new_kw,"Phrase") ); }        
    }
}

function generate_transposed_characters(ad_group, kw) {
    if (kw.length < 2) return;
    for (var i = 0; i < kw.length - 1; i++) {
        var ch1 = kw.charAt(i);
        var ch2 = kw.charAt(i+1);
        var new_kw = kw.substr(0,i)+ch2+ch1+kw.substr(i+2);
        if (_broad_match) { keywords.push( new keyword(_campaign, "TC: " + ad_group, new_kw,"Broad") ); }
        if (_exact_match) { keywords.push( new keyword(_campaign, "TC: " + ad_group, new_kw,"Exact") ); }
        if (_phrase_match) { keywords.push( new keyword(_campaign, "TC: " + ad_group, new_kw,"Phrase") ); }                
    }
}

function generate_double_characters(ad_group, kw) {
    for (var i = 0; i < kw.length; i++) {
        var ch = kw.charAt(i);
        var new_kw = kw.substr(0,i)+ch+ch+kw.substr(i+1);
        if (_broad_match) { keywords.push( new keyword(_campaign, "DC: " + ad_group, new_kw,"Broad") ); }
        if (_exact_match) { keywords.push( new keyword(_campaign, "DC: " + ad_group, new_kw,"Exact") ); }
        if (_phrase_match) { keywords.push( new keyword(_campaign, "DC: " + ad_group, new_kw,"Phrase") ); }                        
    }
}

function generate_ads() {
    ads = [];
    
    var tmp = [];
    for (var i in keywords) {
        var tmp_group = keywords[i].adgroup;
        var found     = false;
        for (var j in tmp) {
            if (tmp[j] == tmp_group) {
                found = true;
                break;
            }
        }
        
        if (!found) tmp.push(tmp_group);
    }
    
    for (var i in tmp) {
        var a1 = new ad(_campaign, tmp[i], _ad1_title, _ad1_line1, _ad1_line2, _ad1_dispurl, _ad1_desturl);
        var a2 = new ad(_campaign, tmp[i], _ad2_title, _ad2_line1, _ad2_line2, _ad2_dispurl, _ad2_desturl);
        ads.push(a1, a2);
    }
    
}

function generate_adwords_keywords() {
    var text = "";
    
    for (var i in keywords) {
        text += '"' + keywords[i].campaign + '","' + keywords[i].adgroup + '","' +keywords[i].text + '","' +keywords[i].match_type + '","","'+_ad_group_url+'"' + nl;
    }
    
    $("#adwords_keywords").val(text);
}

function generate_adwords_ads() {
    var text = "";
    
    for (var i in ads) {
        text += '"' + ads[i].campaign + '","' + ads[i].adgroup + '","' + ads[i].title + '","' + ads[i].line1 + '","' + ads[i].line2 + '","' + ads[i].dispurl + '","' + ads[i].desturl + '"' + nl;
    }
    
    $("#adwords_ads").val(text);
    
}

function generate_yahoo() {
    var text = "";
    var tab  = "\t";
    
    text += "Campaign Name" + tab + "Ad Group Name" + tab + "Component Type" + tab + "Component Status" + tab + "Display Status" + tab +
            "Keyword" + tab + "Keyword Alt Text" + tab + "Keyword Custom URL" + tab + "Sponsored Search Bid (GBP)" + tab + "Sponsored Search Bid Limit (GBP)" + tab +
            "Sponsored Search Min Bid (GBP)" + tab + "Sponsored Search Status" + tab + "Match Type" + tab + "Content Match Bid (GBP)" + tab + "Content Match Bid Limit (GBP)" + tab +
            "Content Match Min Bid (GBP)" + tab + "Content Match Status" + tab + "Ad Name" + tab + "Ad Title" + tab + "Ad Short Description" + tab +"Ad Long Description" + tab +
            "Display URL"+ tab +"Custom URL" + tab + "Watch List" + tab + "Campaign ID" + tab + "Campaign Description" + tab + "Campaign Start Date" + tab + "Campaign End Date" + tab +
            "Ad Group ID"+ tab +"Ad Group: Optimise Ad Display" + tab + "Ad ID" + tab + "Keyword ID" + tab + "Checksum"+ tab + "Error Message" + nl;
    
    text += _campaign + tab + tab + "Campaign"+tab+"On"+tab+tab+tab+tab+tab+tab+tab+tab+"On"+tab+"Standard"+tab+tab+tab+tab+"Off"+tab+tab+tab+tab+tab+tab+tab+"Off"+tab+tab+tab+nl;
    
    var tmp_groups = [];
    
    for (var i in keywords) {
        var k = keywords[i];
        text += _campaign + k.adgroup + tab + "Keyword" + tab + "On"+ tab +"Not Applicable"+tab+k.text+tab+tab+tab+"Default"+tab+tab+tab+tab+
        "Standard"+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+"Off"+tab+tab+tab+tab+tab+tab+tab+tab+tab+nl;
        
        var found = false;
        for (var j in tmp_groups) {
            if (tmp_groups[j] == k.adgroup) {
                found = true;
                break;
            }
        }
        
        if (!found) {
            tmp_groups.push(k.adgroup);
        }
    }
    
    for (var i in tmp_groups) {
        var g = tmp_groups[i];
        text += _campaign + tab + g + tab + "Ad Group"+tab+"On"+tab+tab+tab+tab+_ad_group_yahoo_bid+tab+tab+tab+"On"+tab+"Standard"+tab+"Default"+tab+tab+tab+"Off"+tab+tab+tab+tab+tab+tab+tab+
        "Off"+tab+tab+tab+tab+tab+tab+"Off"+tab+tab+tab+tab+nl;        
    }
    
    for (var i in ads) {
        var a = ads[i];
        text += _campaign + tab + a.adgroup + tab +  "Ad"+tab+"On"+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+"ad_"+i+tab+a.title+tab+a.line1+" "+a.line2+tab+tab+
        a.dispurl+tab+a.desturl+tab+"Off"+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+nl;
    }
    
    $("#yahoo_search_marketing").val(text);
}

function generate_msn_keywords() {
    var text = "";    
    text += '"Keyword","Negative keywords"," Exact","Phrase","Broad","Content","Keyword Destination URL {param1}","Dynamic Text {param2}","Dynamic Text {param3}"' + nl;
    
    for (var i in keywords) {
        text += '"'+keywords[i].text+'","","'+_msn_exact+'","'+_msn_phrase+'","'+_msn_broad+'","'+_msn_content+'","'+_ad_group_url+'","",""' + nl;
    }
    
    $("#msn_keywords").val(text);
}

function generate_msn_ads() {
    var text = "";
    
    text += '"ad title","ad text","display url","destination url"' + nl;
    text += '"'+_ad1_title+'","'+_ad1_line1+' '+_ad1_line2+'","'+_ad1_dispurl+'","'+_ad1_desturl+'"' + nl;
    text += '"'+_ad2_title+'","'+_ad2_line1+' '+_ad2_line2+'","'+_ad2_dispurl+'","'+_ad2_desturl+'"' + nl;
    
    $("#msn_ads").val(text);
}

function show_hide(el_id) {
    
    var _adwords = $("#generate_adwords").is(":checked");
    var _yahoo   = $("#generate_yahoo").is(":checked");
    var _msn     = $("#generate_msn").is(":checked");
    
    if (!_adwords && !_yahoo && !_msn) {
        $(el_id).attr("checked", true);    // leave the selection
        _adwords = $("#generate_adwords").is(":checked");
        _yahoo   = $("#generate_yahoo").is(":checked");
        _msn     = $("#generate_msn").is(":checked");        
    }
    
    if (_yahoo || _msn) {
        $("#bids_headline").show('fast');
    }
    else {
        $("#bids_headline").hide('fast');
    }
    
    if (_yahoo) {
        $("#yahoo_bid").show('fast');
        $("#yahoo_output").show('fast');
    }
    else {
        $("#yahoo_bid").hide('fast');
        $("#yahoo_output").hide('fast');
    }
    
    if (_msn) {
        $("#msn_bid").show('fast');
        $("#msn_output").show('fast');
    }
    else {
        $("#msn_bid").hide('fast');
        $("#msn_output").hide('fast');
    }
    
    if (_adwords) {
        $("#adwords_output").show('fast');
    }
    else {
        $("#adwords_output").hide('fast');
    }    
    
}

$(document).ready(function() {
   if ($.browser.msie) nl = "\n\r";
    
   $("#ad_group_keywords").resizable({ handles: "s,e,se", transparent: true });
   $("#keyword_expansions").resizable({ handles: "s,e,se", transparent: true });
   $("#adwords_keywords").resizable({ handles: "s,e,se", transparent: true });
   $("#adwords_ads").resizable({ handles: "s,e,se", transparent: true });
   $("#yahoo_search_marketing").resizable({ handles: "s,e,se", transparent: true });
   $("#msn_keywords").resizable({ handles: "s,e,se", transparent: true });
   $("#msn_ads").resizable({ handles: "s,e,se", transparent: true });
   
   $("#adwords_keywords").click( function() { this.select() });
   $("#adwords_ads").click( function() { this.select() });
   $("#yahoo_search_marketing").click( function() { this.select() });
   $("#msn_keywords").click( function() { this.select() });
   $("#msn_ads").click( function() { this.select() });
   
   $('#ad1_title').keyup(function() { edit_ad_line( $('#ad1_title'), $('#ad1_title_len'), $('#ad1_title_preview'), 'Headline' ); });
   $('#ad1_line1').keyup(function() { edit_ad_line( $('#ad1_line1'), $('#ad1_line1_len'), $('#ad1_line1_preview'), 'Description 1' ); });
   $('#ad1_line2').keyup(function() { edit_ad_line( $('#ad1_line2'), $('#ad1_line2_len'), $('#ad1_line2_preview'), 'Description 2' ); });
   $('#ad1_display_url').keyup(function() { edit_ad_line( $('#ad1_display_url'), $('#ad1_display_url_len'), $('#ad1_display_url_preview'), 'Display URL' ); });
   
   $('#ad2_title').keyup(function() { edit_ad_line( $('#ad2_title'), $('#ad2_title_len'), $('#ad2_title_preview'), 'Headline' ); });
   $('#ad2_line1').keyup(function() { edit_ad_line( $('#ad2_line1'), $('#ad2_line1_len'), $('#ad2_line1_preview'), 'Description 1' ); });
   $('#ad2_line2').keyup(function() { edit_ad_line( $('#ad2_line2'), $('#ad2_line2_len'), $('#ad2_line2_preview'), 'Description 2' ); });
   $('#ad2_display_url').keyup(function() { edit_ad_line( $('#ad2_display_url'), $('#ad2_display_url_len'), $('#ad2_display_url_preview'), 'Display URL' ); });
   
   $('[class="hidden"]').each( function() {
        this.style.display = 'none';
   });
   
   $('#go').click(function() {
        if (everything_is_ok()) {
            generate_keywords();
            generate_ads();
            if (_do_adwords) generate_adwords_keywords();
            if (_do_adwords) generate_adwords_ads();
            if (_do_yahoo) generate_yahoo();
            if (_do_msn) generate_msn_keywords();
            if (_do_msn) generate_msn_ads();
        }    
   });
   
   $("#generate_adwords").click(function() {
        show_hide("#generate_adwords"); 
   });
   
   $("#generate_yahoo").click(function() {
        show_hide("#generate_yahoo");
   });
   
   $("#generate_msn").click(function() {
        show_hide("#generate_msn");    
   });
      
})