// zval.js
// Zenoss global JavaScript helper
// author: Trevor Rosen

// FORM FUNCTIONS -------------------------------------------------------------------------------

// Add fields from Google cookie to forms
function populateGoogleFields(){
    // Semi-permanent campaign IDs generated by Sugar CRM
    var organic_campaign_id = "7c961bbc-7a12-3e73-cb9c-49907fd3d41f";
    var paid_campaign_id = "a9119818-83e1-1794-869a-49907e6dfd3";
    
    // Grab the __utmz cookie value. Contains all campaign info
    var z = _uGC(document.cookie, '__utmz=', ';');
    
    // Variables to use in hidden fields
    var google_term_c = _uGC(z, 'utmctr=', '|');
    var google_content_c = _uGC(z, 'utmcct=', '|');
    var google_campaign_c = _uGC(z, 'utmccn=', '|');
    var google_source_c = _uGC(z, 'utmcsr=', '|');
    var google_gclid_c = _uGC(z, 'utmgclid=', '|');
    
    // Set a cookie w/ a one-day exipration time to hold cpc/non-cpc status
    if (getCookie('zenosscpcstatus') == null) {
        var cpcExp = new Date;
        cpcExp.setHours(cpcExp.getHours() + 24);
        if ((google_gclid_c != "-") || (getUrlVars()['src'] == 'AdWords')) {
            setCookie("zenosscpcstatus", "cpc", cpcExp);
        }
        if (google_term_c != "-") {
            setCookie("zenosscpcstatus", "organic", cpcExp);
        };
            };
    
    var google_medium_c = getCookie('zenosscpcstatus');
    
    
    // Data from the custom segmentation cookie
    var google_segment_c = _uGC(document.cookie, '__utmv=', ';');
    
    if (google_segment_c != '-') {
        var google_segment_cex = /[1-9]*?\.(.*)/;
        google_segment_c = google_segment_c.match(google_segment_cex);
        google_segment_c = google_segment_c[1];
    }
    else {
        google_segment_c = '';
    };
    
    google_fields = {
        'google_medium_c': google_medium_c,
        'google_term_c': google_term_c,
        'google_content_c': google_content_c,
        'google_campaign_c': google_campaign_c,
        'google_source_c': google_source_c,
        'google_gclid_c': google_gclid_c,
        'google_segment_c': google_segment_c
    };
    
    google_hidden_inputs = new Array();
    
    // Create inputs from Google array
    $.each(google_fields, function(key, value){
        new_input = '<input type="hidden" name="' + key + '" value="' + value + '" id="' + key + '" />';
        google_hidden_inputs.push(new_input);
    });
    
    // Add hidden inputs to all Loopfuse-bound forms
    $.each($('form'), function(i, form){
    
        // Optionally insert Google campaign_id if no other campaign_id is already there
        if (!$(form).children("input[name='campaign_id']").length) {
            var cid_field = $("<input type='hidden' />").attr('name', 'campaign_id');
            switch (google_medium_c) {
                case "cpc":
                    cid_field.val(paid_campaign_id);
                    break;
                case "organic":
                    cid_field.val(organic_campaign_id);
                    break;
                default:
                    if ($(form).children("input[name='default_campaign_id']")) {
                        default_cid = $(form).children("input[name='default_campaign_id']").attr('value');
                        cid_field.val(default_cid);
                    }
                    ;            };
            $(form).append(cid_field);
        };
        
        $.each(google_hidden_inputs, function(i, item){
            $(form).append(item);
        });
    });
}


// Add in a standard fields from Sugar CRM
function addSugarFields(){
    $.each($('form'), function(i, form){
        // Assign download form to LoopFuse
        if (location.pathname == "/download/form") {
            var auid = $("<input type='hidden' />").attr('name', 'assigned_user_id').val('4eb36c9a-d1e6-7990-a982-4922e1686987');
        // Assign the rest to GF
        } else {
            var auid = $("<input type='hidden' />").attr('name', 'assigned_user_id').val('c3b6610c-905f-d9a1-436a-4b7ab3745a4e');
        }
        $(form).append(auid);
        
        var team_id = $("<input type='hidden' />").attr('name', 'team_id').val('1');
        $(form).append(team_id);
    });
}


// Form ids as a query string on their action attributes
function appendFormIds(){
    var forms = $('form');
    $.each(forms, function(i, element){
        var id = $(element).attr('id');
        var action = $(element).attr('action');
        if ((action).search('forms.zenoss.com') != -1) {
            $(element).attr('action', (action + "?form_id=" + id));
        };
            });
}


// Return GET variables as a hash
function getUrlVars(){
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Display US states or Canadian provinces depending on choice
function stateOptions(countryChoice){
    var newSelect = $('<select name="state" class="required"></select>');
    
    switch (countryChoice) {
        case "USA":
            // Drop province list if it's in the DOM
            if ($('#province-list')) {
                $('#province-list').remove();
            }
            ;            $.each(statesOptionList(), function(index, val){
                newSelect.append($(val));
            });
            var container = $('<p id="state-list"><label>State<span class="required_field">*</span></label></p>');
            container.append(newSelect);
            $('#country').parent().after(container);
            break;
            
        case "CANADA":
            // Drop state list if it's in the DOM
            if ($('#state-list')) {
                $('#state-list').remove();
            }
            ;            $.each(provincesOptionList(), function(index, val){
                newSelect.append($(val));
            });
            var container = $('<p id="province-list"><label>Province<span class="required_field">*</span></label></p>');
            container.append(newSelect);
            $('#country').parent().after(container);
            break;
            
        default:
            // Make sure neither is there if any other country picked
            if ($('#state-list')) {
                $('#state-list').remove();
            }
            ;            
if ($('#province-list')) {
                $('#province-list').remove();
            }
            ;    };
    // End switch
}

function statesOptionList(){
    var states = {
        'Select State': '',
        'Alabama': 'Alabama',
        'Alaska': 'Alaska',
        'Arizona': 'Arizona',
        'Arkansas': 'Arkansas',
        'California': 'California',
        'Colorado': 'Colorado',
        'Connecticut': 'Connecticut',
        'Delaware': 'Delaware',
        'District Of Columbia': 'District Of Columbia',
        'Florida': 'Florida',
        'Georgia': 'Georgia',
        'Hawaii': 'Hawaii',
        'Idaho': 'Idaho',
        'Illinois': 'Illinois',
        'Indiana': 'Indiana',
        'Iowa': 'Iowa',
        'Kansas': 'Kansas',
        'Kentucky': 'Kentucky',
        'Louisiana': 'Louisiana',
        'Maine': 'Maine',
        'Maryland': 'Maryland',
        'Massachusetts': 'Massachusetts',
        'Michigan': 'Michigan',
        'Minnesota': 'Minnesota',
        'Mississippi': 'Mississippi',
        'Missouri': 'Missouri',
        'Montana': 'Montana',
        'Nebraska': 'Nebraska',
        'Nevada': 'Nevada',
        'New Hampshire': 'New Hampshire',
        'New Jersey': 'New Jersey',
        'New Mexico': 'New Mexico',
        'New York': 'New York',
        'North Carolina': 'North Carolina',
        'North Dakota': 'North Dakota',
        'Ohio': 'Ohio',
        'Oklahoma': 'Oklahoma',
        'Oregon': 'Oregon',
        'Pennsylvania': 'Pennsylvania',
        'Rhode Island': 'Rhode Island',
        'South Carolina': 'South Carolina',
        'South Dakota': 'South Dakota',
        'Tennessee': 'Tennessee',
        'Texas': 'Texas',
        'Utah': 'Utah',
        'Vermont': 'Vermont',
        'Virginia': 'Virginia',
        'Washington': 'Washington',
        'West Virginia': 'West Virginia',
        'Wisconsin': 'Wisconsin',
        'Wyoming': 'Wyoming'
    };
    
    var stateOptions = new Array();
    
    $.each(states, function(key, val){
        newOption = '<option value="' + val + '">' + key + '</option>';
        stateOptions.push(newOption);
    });
    
    return stateOptions;
}

function provincesOptionList(){
    var provinces = {
        '': 'Select Province',
        'Alberta (AB)': 'Alberta (AB)',
        'British Columbia (BC)': 'British Columbia (BC)',
        'Manitoba (MB)': 'Manitoba (MB)',
        'New Brunswick (NB)': 'New Brunswick (NB)',
        'Newfoundland and Labrador (NL)': 'Newfoundland and Labrador (NL)',
        'Northwest Territories (NT)': 'Northwest Territories (NT)',
        'Nova Scotia (NS)': 'Nova Scotia (NS)',
        'Nunavut (NU)': 'Nunavut (NU)',
        'Prince Edward Island (PE)': 'Prince Edward Island (PE)',
        'Saskatchewan (SK)': 'Saskatchewan (SK)',
        'Ontario (ON)': 'Ontario (ON)',
        'Quebec (QC)': 'Quebec (QC)',
        'Yukon (YT)': 'Yukon (YT)'
    };
    
    var provinceOptions = new Array();
    
    $.each(provinces, function(key, val){
        newOption = '<option value="' + key + '">' + val + '</option>';
        provinceOptions.push(newOption);
    });
    
    return provinceOptions;
}


// For letters-only (no digits or punctuation) fields  
jQuery.validator.addMethod("lettersonly", function(value, element){
    return this.optional(element) || /^[aA-zZ \w]+/i.test(value);
    
}, "Letters only please");

// Requires at least one of a set of checkboxes to be checked.  Place on first checkbox in the set.
// Be sure to also include an errorPlacement block as in the commented example below.
jQuery.validator.addMethod('multi-checkbox', function(value, element, params){
    return $(element).parent().children("input:checked").length > 0;
}, "Please choose at least one option from the checkbox set");

// --------------------- EXAMPLE -- DO NOT UNCOMMENT ---------------------
// errorPlacement: function(error,element){
//   switch(element.attr("name")){
//     case "eval_feature_auto_disc_c":
//       error.insertAfter("#features-checkbox-label");
//     break;
//     
//     case "eval_target_operating_systems_c":
//       error.insertAfter("#targets-checkbox-label");
//     break;
//     
//     default:
//       error.insertAfter(element);
//   };
//     
// }
// --------------------- EXAMPLE -- DO NOT UNCOMMENT ---------------------

// Adds a device range field to make Loopfuse lead nurturing easier
function addDeviceRange(){
    if ($('input#qtymonitored_c')) {
        $('input#qtymonitored_c').change(function(){
            // If field, blank it
            if ($('input#qtymonitored_range_c')) {
                $('input#qtymonitored_range_c').remove();
            };
            var value = $(this).val();
            var deviceRangeField = $('<input type="hidden" id="qtymonitored_range_c" name="qtymonitored_range_c" />');
            value >= 250 ? $(deviceRangeField).val("above_250") : $(deviceRangeField).val("below_250");
            $(this).parents('form').append($(deviceRangeField));
        });
    };
    }

// TAB FUNCTIONS -------------------------------------------------------------------------------

// Parses a slug out of the URL to pass as arg to activateTab().  First checks that a tab slug is valid.
function requestedTab(){
    startingURL = window.document.location.href;
    allTabs = jQuery.map($('ul.tab-nav li a'), function(n, i){
        return $(n).attr('href');
    });
    if (startingURL.search('#') != -1) {
        urlPieces = startingURL.split('#');
        if (jQuery.inArray(urlPieces[1], allTabs) != -1) {
            return urlPieces[1];
        }
        else {
            return false;
        };
            };
    }

// Boot tabs -- put in the ready event for a tabbed page
function startTabs(){
    requestedTab() ? activateTab(requestedTab()) : activateDefaultTab();
    $('ul.tab-nav li a').click(function(){
        activateTab($(this).attr('href'));
        return false;
    });
}

// Does what you'd think
function activateTab(tabID){
    $("ul.tab-nav li.active-tab").removeClass('active-tab');
    $('ul.tab-nav li a[href=' + tabID + ']').parent().addClass('active-tab');
    $('div.active-tab').removeClass('active-tab');
    newTab = tabID.search('#') != -1 ? tabID : ("#" + tabID); //Don't care if a '#' is passed at front of tabID
    $(newTab).addClass('active-tab');
}

// Activates the first tab on a page
function activateDefaultTab(){
    $('ul.tab-nav li:first').addClass('active-tab');
    $('div.tab-content:first').addClass('active-tab');
}

// CONVENIENCE FUNCTIONS -----------------------------------------------------------------------

function setCookie(name, data, expiration){
    var defaultExpiration = new Date;
    defaultExpiration.setDate(defaultExpiration.getDate() + 180);
    if (!expiration) {
        var expiration = defaultExpiration.toUTCString();
    }
    else {
        expiration = expiration.toUTCString();
    };
    var c = (name + "=" + escape(data));
    c = c + (";expires =" + expiration);
    document.cookie = c;
}

function getCookie(name){
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') 
            c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) 
            return c.substring(nameEQ.length, c.length);
    }
    return null;
}


// Removes title attr on Lightbox thumbnail links, replaces for caption on mousedown
function killLightboxTooltips(){
    $.each($('.lightbox'), function(i, link){
        var title = $(link).attr('title');
        $(link).bind("mouseleave mousedown", function(){
            $(this).attr('title', title);
        });
        $(link).bind("mouseenter", function(){
            $(this).attr('title', "");
        });
    });
}

// Remove super-long-named pseudo-countries from the UN countries list
function shortenCountryList(){
    $('#country option[value="NETHERLANDS ANTILLES NEUTRAL ZONE"]').remove();
}

// Convenience function for non-link redirects
function goto(url){
    window.location.href = url;
}

// Convenience function for reseting a form field
function resetField(field, reset){
    var vD = field.defaultValue;
    if (field.value == (reset ? '' : vD)) 
        field.value = (reset ? vD : '');
}

// One function to rule them all -- call this from main template on ready event
function formMagic(){
    // populateGoogleFields();
    addSugarFields();
    appendFormIds();
    addDeviceRange();
    shortenCountryList();
}
