﻿
$(function() {
    $('.ajsPasswordWatermark').advortoPasswordWatermark();
});

(function($) {
    $.fn.advortoPasswordWatermark = function(oInit) {
        var defaults = {};
        var options = $.extend(defaults, oInit);

        /* Constructor */
        return this.each(function() {
            var watermark = $('<input type="text" value="' + options.waterMarkText + '" />');
            var password = $(this).after(watermark);

            watermark.focus(function() {
                $(this).hide()
                       .prev().show()
                              .focus();
            });

            password.hide()
                    .blur(function() {
                        if ($(this).val() == '') {
                            $(this).hide()
                                   .next().show();
                        }
                    });
        });
    };

    $.fn.cascadingDropDownList = function(oInit) {
        var defaults = {};

        var options = $.extend(defaults, oInit);

        function _fnBuildMappedDDL(container, first, data, source) {
            var ddl = $('<select />').append($('<option>' + first + '</option>'));

            ddl.data('data', data);

            for (key in data) {
                ddl.append($('<option />').val(key)
                                          .text(key));
            }

            container.append(ddl);

            ddl.change(function() {
                var newValues = [];

                var s = $(this).find(':first').is(':selected') ? $(this).prev() : $(this);

                var currentData = s.data('data')[s.val()];

                /* Deselect everything */
                source.children('OPTION:selected').attr('selected', false);

                /* Select any values below the current one */
                var selection = _fnGetValues(currentData);
                for (key in selection) {
                    var localSelection = selection[key];
                    source.find('OPTION').filter(function() { return $(this).text() == localSelection; }).attr('selected', true);
                }

                $(this).nextAll().remove();

                if (options.mappingSource !== '') {
                    var selected = '';
                    $(this).prevAll('SELECT').andSelf().each(function() {
                        selected += $(this).children('OPTION:selected').text() + options.splitCharacter;
                    });
                    source.prevAll('[id$="hidSelection"]').val(selected);
                }

                if (currentData != null && currentData.constructor == Object) {
                    container.append(_fnBuildMappedDDL(container, first, currentData, source));
                }
            });

            /* Add the next drop down list if items are selected */
            var selected = source.children('OPTION:selected');
            if (source.children('OPTION:selected').length != _fnGetValues(data).length) {
                for (key in data) {
                    if (data[key].constructor == Object || data[key].constructor == Array) {
                        var localKey = key;
                        localValues = _fnGetValues(data[localKey]);
                        if ($.inArray(source.children(':selected:first').text(), localValues) > -1) {
                            ddl.find('OPTION').filter(function() { return $(this).text() == localKey; }).attr('selected', true);
                            if (data[localKey].constructor == Object) {
                                _fnBuildMappedDDL(container, first, data[localKey], source);
                            }
                        }
                    }
                }
            }

            return ddl;
        }

        function _fnGetValues(data) {
            var values = [];
            for (key in data) {
                if (data[key].constructor == Object || data[key].constructor == Array) {
                    var d = _fnGetValues(data[key]);
                    for (key in d) {
                        values.push(d[key]);
                    }
                }
                else {
                    values.push(data[key]);
                }
            }

            return values;
        }

        /* Constructor */
        return this.each(function() {
            var source = $(this);

            if (!source.data('cascading')) {
                var container = $('<div />');

                source.after(container);

                var mapping;

                /* Mapping is provided */
                if (options.mappingSource !== '') {
                    mapping = eval(options.mappingSource);
                }
                /* Build mapping from dropdownlist */
                else {
                    mapping = {};
                    source.children().each(function() {
                        var element = mapping;
                        var values = $(this).text().split(options.splitCharacter);
                        for (var i = 0; i < values.length; i++) {
                            if (i !== values.length - 1) {
                                if (!element[values[i]]) {
                                    element[values[i]] = {};
                                }
                                element = element[values[i]];
                            }
                            else {
                                element[values.pop()] = [$(this).text()];
                            }
                        }
                    });
                }

                _fnBuildMappedDDL(container, options.defaultValue, mapping, source);

                source.data('cascading', true);
            }
        });
    };
})(jQuery);
