{"version":3,"sources":["Component/InputGrid.js","Component/Listbox.js","Component/Pager.js","Component/Portlets.js","Component/SmoothForm.js","Component/spin.js","Component/Trace.js","Component/Treeview.js"],"names":[],"mappings":"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","file":"../component.min.js","sourcesContent":["(function($) {\r\n\t/* Input Grid Plugin\r\n\t * \r\n\t * The input grid maintains a number of rows/columns for a specified snippit of HTML. \r\n\t * It will duplicate the current row when 1 empty input remains. By default the input \r\n\t * is a single text box but can be overridden to handle complex inputs and custom HTML.\r\n\t * To override the component, set the input configuration attribute as well as implement\r\n\t * the getValue, setValue, setFocus, isEmpty and clearValue methods. Some methods may \r\n\t * not need to be overridden (with the default working properly).\r\n\t */\r\n\t$.fn.originInputGrid = function(options) {\r\n\t\treturn this.each(function() {\r\n\t\t\tvar dataset = $(this).dataset();\r\n\t\t\tvar opts = $.extend({\r\n\t\t\t\tcolumns: 5,\r\n\t\t\t\trows: 2,\r\n\t\t\t\tinput: '',\r\n\t\t\t\tgetValue: function() {\r\n\t\t\t\t\treturn $(this).val() || '';\r\n\t\t\t\t},\r\n\t\t\t\tsetValue: function(value) {\r\n\t\t\t\t\t$(this).val( value );\r\n\t\t\t\t},\r\n\t\t\t\tsetFocus: function() {\r\n\t\t\t\t\t$(this).find(':text[value=]:eq(0)').focus();\r\n\t\t\t\t},\r\n\t\t\t\tisEmpty: function() {\r\n\t\t\t\t\treturn $(this).val() == '';\r\n\t\t\t\t},\r\n\t\t\t\tclearValue: function() {\r\n\t\t\t\t\t$(this).val('');\r\n\t\t\t\t},\r\n\t\t\t\tvalidate: null,\r\n\t\t\t\tcssClass: null\r\n\t\t\t}, dataset || {}, options || {} );\r\n\t\t\t$(this)\r\n\t\t\t\t.data('options', opts)\r\n\t\t\t\t.addClass('originInputGrid')\r\n\t\t\t\t.bind('keyup', function(evt) {\r\n\t\t\t\t\tvar options = $(this).data('options');\r\n\t\t\t\t\tvar inputs = $(this).find('.inputGridValue').filter(function() {\r\n\t\t\t\t\t\treturn options.isEmpty.call(this);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif ( inputs.length <= 1 ) {\r\n\t\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t\t.closest('.originInputGrid')\r\n\t\t\t\t\t\t\t.originInputGridAdd( 1 );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t$(this).originInputGridAdd( opts.rows );\r\n\t\t\tif ( opts.values ) {\r\n\t\t\t\tvar values = opts.values.split(/\\s*,\\s*/);\r\n\t\t\t\t$(this).originInputGridValues( values, false );\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\t\r\n\t/*\r\n\t * This method is used to add new empty rows to the grid.\r\n\t */\r\n\t$.fn.originInputGridAdd = function(rows) {\r\n\t\treturn this.each(function() {\r\n\t\t\tvar options = $(this).closest('.originInputGrid').data('options');\r\n\t\t\t$('
')\r\n\t\t\t\t.append(\r\n\t\t\t\t\t$( options.input )\r\n\t\t\t\t\t\t.If( options.cssClass != null )\r\n\t\t\t\t\t\t\t.addClass( options.cssClass )\r\n\t\t\t\t\t\t.end()\r\n\t\t\t\t\t\t.css('width', Math.floor( 87 / options.columns ) + '%')\r\n\t\t\t\t\t\t.duplicate( options.columns )\r\n\t\t\t\t)\r\n\t\t\t\t.duplicate( rows, true )\r\n\t\t\t\t.appendTo( this )\r\n\t\t\t\t.If( options.validate !== null )\r\n\t\t\t\t\t.find(':input') \r\n\t\t\t\t\t\t.bind('blur', function() {\r\n\t\t\t\t\t\t\tvar error = false;\r\n\t\t\t\t\t\t\tif ( typeof options.validate == 'string' ) {\r\n\t\t\t\t\t\t\t\terror = $(this).val().match( new RegExp( options.validate ) ) === null;\r\n\t\t\t\t\t\t\t} else if ( $.isFunction( options.validate ) ) {\r\n\t\t\t\t\t\t\t\terror = !!options.validate.call(this);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t$(this).toggleClass('error', error);\r\n\t\t\t\t\t\t});\r\n\t\t});\r\n\t};\r\n\t\r\n\t/*\r\n\t * This method clears the entire input grid (but does not change the number of input \r\n\t * rows.\r\n\t */\r\n\t$.fn.originInputGridClear = function() {\r\n\t\tvar options = $(this).closest('.originInputGrid').data('options');\r\n\t\treturn this.find('.inputGridValue').each(function() {\r\n\t\t\toptions.clearValue.call(this);\r\n\t\t}).end();\r\n\t};\r\n\t\r\n\t/*\r\n\t * This method clears the entire input grid AND resets the number of rows to the \r\n\t * default specified by the options upon init.\r\n\t */\r\n\t$.fn.originInputGridReset = function() {\r\n\t\tvar options = $(this).closest('.originInputGrid').data('options');\r\n\t\t$(this).closest('.originInputGrid')\r\n\t\t\t\t.empty()\r\n\t\t\t\t.end()\r\n\t\t\t\t.originInputGridAdd( options.rows );\r\n\t};\r\n\t// Reduce the values to only a unique set\r\n\t// TODO:\r\n\t/*\r\n\t$.fn.originInputGridUnique = function() {\r\n\t\treturn this.each(function() {\r\n\t\t\t\r\n\t\t});\r\n\t};\r\n\t*/\r\n\t\r\n\t/*\r\n\t * Sets focus to the first empty element.\r\n\t */\r\n\t$.fn.originInputGridFocus = function() {\r\n\t\tvar options = $(this).closest('.originInputGrid').data('options');\r\n\t\treturn this.each(function() {\r\n\t\t\toptions.setFocus.call( this );\r\n\t\t});\r\n\t};\r\n\t\r\n\t/*\r\n\t * Sets the grid to the values passed in the first argument (array). Optionally may \r\n\t * specify if the values should overwrite the current grid values or append to the grid \r\n\t * (expanding it as necessary). The final arguemnt is the unique flag.\r\n\t *\r\n\t * Returns an array of values when no arguments are passed in .originInputGridValues()\r\n\t */\r\n\t$.fn.originInputGridValues = function(values, append, unique) {\r\n\t\tvar options = $(this).closest('.originInputGrid').data('options');\r\n\t\tif ( arguments.length == 0 ) {\r\n\t\t\tvar values = [];\r\n\t\t\tthis.each(function() {\r\n\t\t\t\t$(this).find('.inputGridValue').each(function() {\r\n\t\t\t\t\tvar value = options.getValue.call(this);\r\n\t\t\t\t\tif ( $.trim(value) != '' ) {\r\n\t\t\t\t\t\tvalues.push( value );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn values;\r\n\t\t}\r\n\t\treturn this.each(function() {\r\n\t\t\tvar inputs = $(this).find('.inputGridValue');\r\n\t\t\t\r\n\t\t\tif ( append !== false ) {\r\n\t\t\t\tinputs = inputs.filter(function() {\r\n\t\t\t\t\treturn options.isEmpty.call(this);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t$(this).originInputGridClear();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif ( unique === true ) {\r\n\t\t\t\tvar il = values.length;\r\n\t\t\t\tinputs.each(function() {\r\n\t\t\t\t\tfor ( var i = 0; i < il; i++ ) {\r\n\t\t\t\t\t\tif ( values[i] == $(this).val() ) {\r\n\t\t\t\t\t\t\tvalues[i] = null;\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tvar tmp = [];\r\n\t\t\t\tfor ( var i = 0; i < il; i++ ) {\r\n\t\t\t\t\tif ( values[i] !== null ) {\r\n\t\t\t\t\t\ttmp.push( values[i] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvalues = tmp;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif ( ( inputs.length - 1 ) <= values.length ) {\r\n\t\t\t\t$(this).originInputGridAdd( Math.ceil( ( values.length - ( inputs.length - 1 ) ) / options.columns ) );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// We need to find the inputs again since we've modified the grid\r\n\t\t\tinputs = $(this).find('.inputGridValue');\r\n\t\t\t\r\n\t\t\tif ( append !== false ) {\r\n\t\t\t\tinputs = inputs.filter(function() {\r\n\t\t\t\t\treturn options.isEmpty.call(this);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Only iterate over N inputs where N is the number of values we have to set\r\n\t\t\tinputs.slice(0, values.length).each(function() {\r\n\t\t\t\toptions.setValue.call(this, values.shift());\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n})(jQuery);","(function ($) {\r\n /*\r\n * Main listbox method accepting an object of options.\r\n */\r\n $.fn.originListBox = function (options) {\r\n options = $.extend({\r\n sorting: 'auto', \t\t// auto, user (click & move), none @see filterElements()\r\n sortType: 'alpha', \t// Optionally can be a function passed in @see sortItems()\r\n sortBy: 'label', \t// label, description, order @see sortItems()\r\n remove: false, \t\t\t// Add a remove link to the item \r\n\r\n autoInit: true, \t\t// Autoload values from dataUrl? \r\n dataUrl: null, \t\t\t// Provides a list of items to ajax into this component\r\n formatData: null, \t// Callback for transforming JSON returned from the server\r\n postData: null, \t\t// Provides data for getting to this components\r\n selected: null, \t\t// Array of values to select\r\n dataType: 'json', // Default Ajax response type, can be json, html, etc.\r\n\r\n selectable: true, \t\t// Are the items able to be selected\r\n multiSelect: true, \t// Are multiple items able to be selected\r\n maxSelection: -1, \t// Is there a max number of items available for select\r\n unique: true, \t\t// Only allow unique values for list items (multiple items with the same value will be filtered)\r\n\r\n format: null, \t\t\t// Format a single item or pass back an arry of HTML for each item\r\n formatType: 'item', \t// \"item\" or \"list\" (how the format callback will be called; per item or once for all items)\r\n\r\n filterInput: null, \t\t// DOM Selector for an input element to attach key events to. @see originListBoxSetupFilter()\r\n filterCaseSensitive: false, // \r\n filterField: 'label', \t// The field to filter on label or description\r\n filterComparison: 'startsWith', // 'contains', 'exact', 'startsWith', 'endsWith'\r\n\r\n callback: null // Function to call after adding items to the listbox\r\n },\r\n\t\toptions,\r\n\t\t{\r\n\t\t // Private option ( not overrideable )\r\n\t\t sortable: false\r\n\t\t});\r\n // Initialize each DOM element selected as a listbox\r\n return this.each(function () {\r\n $(this).addClass('originListBox');\r\n\r\n // Append an unordered list if one does not exist\r\n if ($('> ul', this).length == 0) {\r\n $(this).append('');\r\n }\r\n\r\n options.multiSelect = options.multiSelect && (options.maxSelection == -1 || options.maxSelection > 1);\r\n $(this).data('options', options);\r\n\r\n // Bind a remove item event handler\r\n if (options.remove) {\r\n // Bind a click event (via event delegation) that measures where the \r\n // click occurred within the LI. If it is on the far right portion of \r\n // the LI, remove the element.\r\n $(this)\r\n\t\t\t\t\t.find('> ul').addClass('remove').end()\r\n\t\t\t\t\t.bind('click', function (evt) {\r\n\t\t\t\t\t if ($(evt.target).is('li')) {\r\n\t\t\t\t\t var offset = $(evt.target).offset();\r\n\t\t\t\t\t var width = $(evt.target).width();\r\n\t\t\t\t\t if ((offset.left + width - 38) < evt.pageX) {\r\n\t\t\t\t\t $(evt.target).originListBoxRemove();\r\n\t\t\t\t\t }\r\n\t\t\t\t\t }\r\n\t\t\t\t\t});\r\n }\r\n\r\n if (options.filterInput !== null) {\r\n // Setup the input box (specified by the filterInput DOM selector) with key bindings\r\n // to filter the list upon user input.\r\n $(options.filterInput).originListBoxSetupFilter(this);\r\n }\r\n\r\n // Make list selectable\r\n if (options.selectable === true) {\r\n $(this).originListBoxSelectable(true, options.multiSelect);\r\n }\r\n\r\n // Make list sortable by allowing user to click & drag\r\n if (options.sorting == 'user') {\r\n $(this).originListBoxUserSortable(true);\r\n }\r\n\r\n // Load in the options if a url exists\r\n if (options.dataUrl && options.autoInit !== false) {\r\n $(this).originListBoxLoad(options.dataUrl, options.postData || {}, function () {\r\n if (options.selected !== null) {\r\n $(this).originListBoxSelect(options.selected);\r\n }\r\n }, options.formatData);\r\n }\r\n });\r\n };\r\n\r\n /*\r\n * Given a URL, execute an Ajax request (expecting JSON in return) to load the data into the list.\r\n * Elements returned from the Ajax request are appendeded to the list. Expected data format to JSON\r\n * response is:\r\n * { value: '', label: '', description: '', order: '' }\r\n * If the format being returned from the server is different, the developer may implement the formatData \r\n * callback in the listbox options (or specify it as the 4th argument). The formatData callback is passed \r\n * the JSON returned from the server and is expected to return an array of objects with at least the \r\n * format specified above.\r\n */\r\n $.fn.originListBoxLoad = function (url, post, callback, formatData) {\r\n var options = $(this).closest('.originListBox').data('options');\r\n var data = {};\r\n\r\n if (arguments.length == 1 && typeof arguments[0] == 'object') {\r\n data = $.extend(options, arguments[0]);\r\n } else {\r\n data = $.extend(options, { url: url, post: post, callback: callback, formatData: formatData });\r\n }\r\n\r\n if (!$.isFunction(formatData)) {\r\n formatData = options.formatData;\r\n }\r\n return this.each(function () {\r\n if ($.isFunction(data.post)) {\r\n data.callback = data.post;\r\n data.post = '';\r\n }\r\n\r\n var _this = this;\r\n $.ajax({\r\n url: data.url,\r\n data: data.post || {},\r\n type: 'POST',\r\n dataType: data.dataType,\r\n error: function (request, status, error) {\r\n log(error);\r\n },\r\n success: function (response) {\r\n if ($.isFunction(data.formatData)) {\r\n // Allow the developer to make any data transformations\r\n response.data = data.formatData(response.data);\r\n }\r\n \r\n if (response.data && response.data.length == 0) {\r\n $('#modalInstructionsText').hide();\r\n $('#modalInstructionsTextNoData').show();\r\n }\r\n\r\n switch (data.dataType) {\r\n case 'html':\r\n if (data.filterInput != null) {\r\n $(data.filterInput).val('');\r\n }\r\n $(_this)[0].innerHTML = response;\r\n if ($.isFunction(data.callback)) {\r\n data.callback.call(_this);\r\n }\r\n break;\r\n default:\r\n // For all other cases like 'json'\r\n $(_this).originListBoxBulkAdd(response.data, function (i, finished) {\r\n if (finished) {\r\n if ($.isFunction(data.callback)) {\r\n data.callback.call(_this);\r\n }\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n /*\r\n * Adds one or more elements to the list box. Multiple elements may be \r\n * added by passing in an array of objects containing the keys: label, value,\r\n * description and order as argument 1. Additionally a single item may be \r\n * added by passing in 4 arguments. @see originListBoxBulkAdd()\r\n */\r\n $.fn.originListBoxAdd = function (label, value, description, order) {\r\n if (arguments.length == 0 || !arguments[0]) {\r\n // No elements were passed in, simply return\r\n // This is needed as some server responses return an empty response\r\n return this;\r\n } else if (typeof arguments[0] == 'object') {\r\n // We have been handed an array of objects to add\r\n var options = $(this).data('options');\r\n var newItems = arguments[0];\r\n if (newItems.length == 0) {\r\n return this;\r\n }\r\n\r\n var itemCount = $('> ul > li', this).length;\r\n // Disable resorting all of the items if there are more than 75 in the list\r\n if (options.sorting == 'auto' && itemCount < 75) {\r\n var current = $(this).originListBoxItemData();\r\n var all = $.merge(current, newItems);\r\n all = sortItems(all, options.sortBy, options.sortType);\r\n $('> ul', this)\r\n\t\t\t\t\t.empty()\r\n\t\t\t\t\t.append(getHtmlForListItems(all, options));\r\n newItems = filterElementsByValues.call(this, newItems);\r\n } else {\r\n // Just append our items to the end of the list options\r\n newItems = $(getHtmlForListItems(newItems, options));\r\n $('> ul', this).append(newItems);\r\n }\r\n\r\n // Now that our list has been updated, go through and strip out any \r\n // duplicate values\r\n if (options.unique) {\r\n // Did the user implement a callback?\r\n var items = $(this).find('> ul > li');\r\n var hash = {}, exclude = [];\r\n items.each(function () {\r\n var val = $(this).dataset('value');\r\n if (!hash[val]) {\r\n hash[val] = true;\r\n } else {\r\n $(this).remove();\r\n exclude.push(this);\r\n }\r\n });\r\n exclude = $(exclude);\r\n newItems = $(newItems).filter(function () {\r\n return exclude.index(this) == -1;\r\n });\r\n }\r\n\r\n $(this).trigger('listboxadded', [newItems.originListBoxItemData(), newItems.get()]);\r\n // Select the DOM elements we just created & added\r\n if (arguments[1] === true) {\r\n // Push stack\r\n return this.pushStack(items);\r\n }\r\n return this;\r\n } else {\r\n return this.originListBoxAdd({ label: label, value: value, description: description, order: order });\r\n }\r\n };\r\n\r\n /*\r\n * Bulk adds a large list of items to the listbox in a non-blocking fashion.\r\n * This method chunks the elements into 300 item blocks and executes it using\r\n * setTimeout.\r\n */\r\n $.fn.originListBoxBulkAdd = function (items, callback) {\r\n var options = $(this).data('options');\r\n var ilen = items.length;\r\n if (ilen > 100) {\r\n var _this = this;\r\n var html = '';\r\n var i = 0;\r\n var $ul = $('> ul', _this);\r\n\r\n if (!$.isFunction(callback)) {\r\n callback = function () { };\r\n }\r\n (function eat(list, size) {\r\n var data = list.slice(0, size);\r\n html += getHtmlForListItems(data, options);\r\n\r\n if (list.length > size) {\r\n setTimeout(function () {\r\n eat(list.slice(size), size);\r\n // Trigger our callback (second param is \"finished\")\r\n callback.call(_this, i, false);\r\n i++;\r\n }, 75);\r\n } else {\r\n // Updating innerHTML directly is much quicker than using jQuery append.\r\n $ul[0].innerHTML += html;\r\n // We're done, trigger the callback\t\t\t\r\n callback.call(_this, i, true);\r\n $(_this).trigger('listboxadded', []);\r\n }\r\n })(items, 300);\r\n return this;\r\n } else {\r\n var ret = this.originListBoxAdd(items);\r\n if ($.isFunction(callback)) {\r\n callback.call(this, 0, true);\r\n }\r\n return ret;\r\n }\r\n };\r\n\r\n /*\r\n * Given an array of objects, returns a single string of HTML generated from those objects.\r\n * This method may be overridden for alternate implementations by setting the options.format \r\n * callback function.\r\n */\r\n function getHtmlForListItems(items, options) {\r\n var html = [], itemHtml = [], il = items.length;\r\n if ($.isFunction(options.format)) {\r\n if (options.formatType == 'list') {\r\n itemHtml = options.format(items);\r\n } else {\r\n for (var i = 0; i < il; i++) {\r\n itemHtml.push(options.format(items[i]));\r\n }\r\n }\r\n } else {\r\n for (var i = 0; i < il; i++) {\r\n var data = $.extend({ value: '', order: '' }, items[i]);\r\n var content = '' + items[i].label + '' + '' + (items[i].description || '') + '';\r\n\r\n delete data.label;\r\n delete data.description;\r\n\r\n var attrs = '';\r\n for (var k in data) {\r\n attrs += ' ' + $.dataset.encodeAttr(k) + '=\"' + data[k] + '\"';\r\n }\r\n var selected = items[i].selected === true ? ' class=\"selected\"' : '';\r\n var title = items[i].title ? ' title=\"' + items[i].title + '\"' : '';\r\n\r\n var liItem = '' + content + '';\r\n itemHtml.push(liItem);\r\n }\r\n\r\n return itemHtml.join('');\r\n }\r\n\r\n // Use a native loop for IE\r\n for (var i = 0; i < il; i++) {\r\n var data = $.extend({ value: '', order: '' }, items[i]);\r\n delete data.label;\r\n delete data.description;\r\n var attrs = '';\r\n for (var k in data) {\r\n attrs += ' ' + $.dataset.encodeAttr(k) + '=\"' + data[k] + '\"';\r\n }\r\n html.push('');\r\n html.push(itemHtml[i]);\r\n html.push('');\r\n }\r\n return html.join('');\r\n }\r\n\r\n /*\r\n * Given a list of items, this method will an alphabetical or numerical sort on those items\r\n * and return an array of the new items. Optionally the sort algorithm may be overriden by \r\n * defining options.sortType as a callback function returning -1, 0 or 1.\r\n */\r\n function sortItems(items, key, type) {\r\n if ($.isFunction(type)) {\r\n items.sort(type);\r\n } else if (type == 'numeric') {\r\n items.sort(function (a, b) {\r\n var ta = ('' + a[key]).replace(/[^0-9\\.-]/g, '').match(/-?[0-9]+(\\.\\d+)?/);\r\n var tb = ('' + b[key]).replace(/[^0-9\\.-]/g, '').match(/-?[0-9]+(\\.\\d+)?/);\r\n var aa = parseFloat(ta[0], 10),\r\n\t\t\t\t\tbb = parseFloat(tb[0], 10);\r\n return (aa > bb ? 1 :\r\n\t\t\t\t\t\t\taa == bb ? 0 :\r\n\t\t\t\t\t\t\t\t-1);\r\n });\r\n } else {\r\n items.sort(function (a, b) {\r\n var aa = a[key].toUpperCase(),\r\n\t\t\t\t\tbb = b[key].toUpperCase();\r\n return (aa > bb ? 1 :\r\n\t\t\t\t\t\t\taa == bb ? 0 :\r\n\t\t\t\t\t\t\t\t-1);\r\n });\r\n }\r\n return items;\r\n }\r\n\r\n /*\r\n * This method will take a field and value and return an array of DOM elements in the \r\n * listbox matching those conditions. Additionally the case sensativity and comparison \r\n * type (startsWith, endsWith, etc) may be specified. \r\n */\r\n function filterElements(field, value, caseSensitive, comparison, includeDisabled) {\r\n if ($(this).is('div.originListBox')) {\r\n // If the listbox is \"availabletitle\", change the comparison to \"contains\" (PBI #33416)\r\n if ($(this)[0].id == 'availabletitle')\r\n comparison = 'contains';\r\n var elements = $('> ul > li', this);\r\n if (value !== undefined) {\r\n // Tokenize our string (this contains all values we're search for so we can do an indexOf)\r\n if (comparison == 'exact') {\r\n value = '-#_#-' + value + '-#_#-';\r\n } else if (comparison == 'startsWith') {\r\n value = '-#_#-' + value;\r\n } else if (comparison == 'endsWith') {\r\n value = value + '-#_#-';\r\n }\r\n // else value 'contains'\r\n if (caseSensitive === false) {\r\n value = value.toLowerCase();\r\n }\r\n\r\n // Unpacked this loop to a native one since IE really hates looping \r\n // over large lists\r\n var elements = $(elements);\r\n if (includeDisabled === false) {\r\n elements = elements.not('.elementDisabled');\r\n }\r\n\r\n var _values = [];\r\n // Determine which field we're searching (dataset attribute or html tag)\r\n if (elements.eq(0).dataset(field) != undefined) {\r\n elements.each(function () {\r\n _values.push([this, $(this).dataset(field)]);\r\n });\r\n } else {\r\n elements.children('span.' + field).each(function () {\r\n _values.push([this, this.innerHTML]);\r\n });\r\n }\r\n\r\n var il = _values.length;\r\n var tmp = [];\r\n\r\n for (var i = 0; i < il; i++) {\r\n var txt = _values[i][1];\r\n if (caseSensitive === false) {\r\n txt = txt.toLowerCase();\r\n }\r\n if (('-#_#-' + txt + '-#_#-').indexOf(value) > -1) {\r\n tmp.push($(_values[i][0]).closest('li')[0]);\r\n }\r\n }\r\n\r\n elements = $(tmp);\r\n }\r\n } else {\r\n var elements = $(this).closest('li');\r\n }\r\n return elements;\r\n }\r\n\r\n /*\r\n * This method returns a list of listbox DOM elements matched given an array of values. An \r\n * optional flag is provided to force the elements to be returned in the order of the array \r\n * of values passed in.\r\n */\r\n function filterElementsByValues(values, preserveOrder) {\r\n if ($(this).is('div.originListBox')) {\r\n var elements = $('> ul > li', this);\r\n if (values) {\r\n // Is the values arg an object? If so, look for the value key\r\n if (values && values[0] && typeof values[0] == 'object') {\r\n for (var i = 0; i < values.length; i++) {\r\n values[i] = values[i].value;\r\n }\r\n }\r\n // Tokenize our string (this contains all values we're search for so we can do an indexOf)\r\n var valuesString = '-#_#-' + values.join('-#_#-') + '-#_#-';\r\n\r\n // Unpacked this loop to a native one since IE really hates looping \r\n // over large lists\r\n var il = elements.length;\r\n var tmp = [];\r\n var ordered = [];\r\n for (var i = 0; i < il; i++) {\r\n var txt = $(elements[i]).dataset('value');\r\n if (valuesString.indexOf('-#_#-' + txt + '-#_#-') > -1) {\r\n tmp.push($(elements[i])[0]);\r\n ordered[tmp.length - 1] = txt;\r\n }\r\n }\r\n elements = $(tmp);\r\n\r\n // We need to re-order or filtered values to match the order of values passed in\r\n if (preserveOrder) {\r\n var sorted = [];\r\n for (var i = 0; i < values.length; i++) {\r\n for (var j = 0; j < ordered.length; j++) {\r\n if (values[i] == ordered[j]) {\r\n sorted.push(elements[j]);\r\n break;\r\n }\r\n }\r\n }\r\n elements = $(sorted);\r\n }\r\n }\r\n } else {\r\n var elements = $(this).closest('li');\r\n }\r\n return elements;\r\n }\r\n\r\n /*\r\n This method is used to the visible elements in a origin listbox.\r\n */\r\n function getListBoxElements() {\r\n var elements = [];\r\n if ($(this).is('div.originListBox')) {\r\n // using loop to get the visible li elements. Because li:visible && li:not(:hidden) returns 0.\r\n // li:visible returns 0 because display value for li elements is 'listitem'.\r\n // And li:not(:hidden) returns 0 because the li elements are hidden.\r\n $('> ul > li', this).each(function () {\r\n if ($(this).css('display') != 'none')\r\n elements.push($(this));\r\n });\r\n }\r\n\r\n return elements;\r\n }\r\n\r\n /*\r\n * This plugin method takes a key value (as specified in the list items data, so for example \r\n * label, description, value and order are all valid as well as any additional attributes added \r\n * to elements). This function will then re-sort the listbox DOM elements.\r\n */\r\n $.fn.originListBoxSort = function (key) {\r\n return this.each(function () {\r\n var options = $(this).data('options');\r\n if (!key) {\r\n key = options.sortBy;\r\n }\r\n\r\n var items = $(this).originListBoxItemData();\r\n items = sortItems(items, key, options.sortType);\r\n\r\n // Empty and rebuild our list\r\n elements = $('> ul', this)\r\n\t\t\t\t\t\t\t.empty()\r\n\t\t\t\t\t\t\t.append(getHtmlForListItems(items, options.remove))\r\n\t\t\t\t\t\t\t.find('> li');\r\n\r\n // Trigger a sorted event\r\n $(this).trigger('listboxsorted', [elements.originListBoxItemData(), elements.get()]);\r\n });\r\n };\r\n\r\n /*\r\n * Sets the specified listbox DOM elements to enabled or disabled.\r\n */\r\n $.fn.originListBoxEnableElements = function (enabled) {\r\n return this.filter('li').toggleClass('elementDisabled', !enabled).toggle(enabled).end();\r\n };\r\n\r\n /*\r\n * This method given a set of arguments, will filter (select & hide non-matching) listbox DOM \r\n * elements. You can 'unfilter' (show all elements) by passing in an empty string to the \r\n * value argument.\r\n */\r\n $.fn.originListBoxFilter = function (field, value, comparison) {\r\n // Get our options\r\n var options = $(this).data('options');\r\n if (arguments.length == 1) {\r\n value = arguments[0];\r\n field = options.filterField;\r\n comparison = options.filterComparison;\r\n } else if (arguments.length == 2) {\r\n comparison = arguments[1];\r\n value = arguments[0];\r\n field = options.filterField;\r\n }\r\n\r\n // Get all of our elements\r\n var elements = filterElements.call(this);\r\n\r\n if (value == '') {\r\n selected = elements.not('.elementDisabled');\r\n selected.css({ 'display': 'block' });\r\n } else {\r\n var selected = filterElements.call(this, field, value, options.filterCaseSensitive, comparison, false);\r\n\r\n elements.not(selected).css({ 'display': 'none' });\r\n selected.css({ 'display': 'block' });\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /*\r\n * This method expects an INPUT element to operate on. It then binds the appropriate \r\n * events (such as keyup/keydown) to filter the associated listbox (as specified in argument 1)\r\n * @see originListBoxFilter() for filtering implementation.\r\n */\r\n $.fn.originListBoxSetupFilter = function (listboxToFilter) {\r\n return this.each(function () {\r\n $(this).bind('keydown keyup', function (evt) {\r\n evt.stopPropagation();\r\n evt.stopImmediatePropagation();\r\n\r\n if (evt.which == 13) {\r\n evt.preventDefault();\r\n return false;\r\n }\r\n\r\n if (evt.type == 'keyup') {\r\n evt.preventDefault();\r\n originTimer.start(function () { $(listboxToFilter).originListBoxFilter($(evt.target).val()); });\r\n }\r\n })\r\n\t\t\t.bind('focus blur', function (evt) {\r\n\t\t\t var val = $(this).val();\r\n\t\t\t if (evt.type == 'focus' && val == $(this).attr('defaultValue')) {\r\n\t\t\t $(this).val('');\r\n\t\t\t } else if (evt.type == 'blur' && val == '') {\r\n\t\t\t $(this).val($(this).attr('defaultValue'));\r\n\t\t\t }\r\n\t\t\t});\r\n });\r\n };\r\n\r\n /*\r\n * This is a utility method that given a field, value and comparison will return \r\n * a new jQuery collection containing listbox DOM elements that matched those conditions.\r\n */\r\n $.fn.originListBoxSelectElements = function (field, value, comparison) {\r\n // Get our options\r\n var options = $(this).data('options');\r\n if (arguments.length == 1) {\r\n value = arguments[0];\r\n field = options.filterField;\r\n comparison = options.filterComparison;\r\n } else if (arguments.length == 2) {\r\n comparison = arguments[1];\r\n value = arguments[0];\r\n field = options.filterField;\r\n }\r\n var selected;\r\n if (value == '') {\r\n selected = filterElements.call(this);\r\n } else {\r\n selected = filterElements.call(this, field, value, options.filterCaseSensitive, comparison, true);\r\n }\r\n return this.pushStack(selected);\r\n };\r\n\r\n /*\r\n * This method will take listbox DOM elements and return an array of objects containing\r\n * the meta-data extracted from each DOM element. This method is called in multiple places \r\n * such as when removing an element from one listbox and adding it to a second.\r\n */\r\n $.fn.originListBoxItemData = function (extended) {\r\n if ($(this).is('div.originListBox')) {\r\n elements = getListBoxElements.call(this);\r\n } else {\r\n elements = $(this); //.closest('li'); for some reason jquery resorts the LIs with the closest method.\r\n }\r\n var options = $(this).closest('div.originListBox').data('options');\r\n var items = [];\r\n for (var i = 0, il = elements.length; i < il; i++) {\r\n var dataset = $(elements[i]).dataset();\r\n if (dataset.value && dataset.value.length > 0) {\r\n var item = $.extend({\r\n label: $.trim($('span.label', elements[i]).text()),\r\n value: '',\r\n description: $.trim($('span.description', elements[i]).text()),\r\n order: ''\r\n }, dataset);\r\n if (extended === true) {\r\n item.selected = $(elements[i]).hasClass('selected');\r\n item.element = elements[i];\r\n }\r\n items.push(item);\r\n }\r\n }\r\n return items;\r\n };\r\n\r\n /*\r\n * This method returns the number of visible elements in the listbox.\r\n */\r\n $.fn.originListBoxSize = function () {\r\n var elements = getListBoxElements.call(this);\r\n\r\n if (elements.length > 0)\r\n return elements.length;\r\n\r\n return -1;\r\n };\r\n\r\n /*\r\n * This method returns an array of values from the listbox DOM elements.\r\n */\r\n $.fn.originListBoxValues = function () {\r\n if ($(this).is('div.originListBox')) {\r\n elements = $('> ul > li', this);\r\n } else {\r\n elements = $(this).closest('li');\r\n }\r\n var values = [];\r\n for (var i = 0, il = elements.length; i < il; i++) {\r\n values.push($(elements[i]).dataset('value'));\r\n }\r\n return values;\r\n };\r\n\r\n /*\r\n * This method selects all of the listbox DOM elements\r\n */\r\n $.fn.originListBoxItems = function () {\r\n return this.pushStack($('> ul > li', this));\r\n };\r\n\r\n /*\r\n * This method returns an array of objects from the currently selected listbox DOM elements.\r\n */\r\n $.fn.originListBoxSelected = function (extended) {\r\n return $('> ul > li.selected:visible', this).originListBoxItemData(extended || false);\r\n };\r\n\r\n /*\r\n * This method removes all listbox DOM elements quickly by clearing innerHTML.\r\n */\r\n $.fn.originListBoxEmptyInstantly = function () {\r\n return $(this).each(function () {\r\n // Faster way of removing elements from DOM.\r\n $(this).children('ul')[0].innerHTML = '';\r\n });\r\n };\r\n\r\n /*\r\n * This method removes all listbox DOM elements.\r\n */\r\n $.fn.originListBoxEmpty = function (triggerEvent) {\r\n var elements = filterElementsByValues.call(this);\r\n var div = $(this).closest('div.originListBox').eq(0);\r\n $('> ul', div).empty();\r\n if (triggerEvent !== false && elements.length > 0) {\r\n div.trigger('listboxemptied', [elements.originListBoxItemData(), elements.get()]);\r\n }\r\n return this;\r\n };\r\n\r\n /* \r\n * This method selects the listbox DOM elements matched by the values array and removes them \r\n * from the DOM. It then optionally triggers (by default) the listboxremoved event passing \r\n * in the array of elements removed.\r\n */\r\n $.fn.originListBoxRemove = function (values, triggerEvent, preserveOrder) {\r\n var elements = filterElementsByValues.call(this, values, preserveOrder !== false);\r\n \r\n var div = $(this).closest('div.originListBox').eq(0);\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n if (elements[i].attributes['data-search-suppressed'] == undefined) {\r\n //elements.remove(i);\r\n $(elements[i]).remove();\r\n } else if (elements[i].attributes['data-search-suppressed'] != undefined && elements[i].attributes['data-search-suppressed'].value != 'true') {\r\n //elements.remove(i);\r\n $(elements[i]).remove();\r\n }\r\n }\r\n \r\n if (triggerEvent !== false && elements.length > 0) {\r\n div.trigger('listboxremoved', [elements.originListBoxItemData(), elements.get()]);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /*\r\n * Given a list of values, make sure those values are unselected and trigger the listboxunselected event \r\n * passing in the elements that were currently unselected.\r\n */\r\n $.fn.originListBoxUnselect = function (values, triggerEvent) {\r\n var elements = filterElementsByValues.call(this, values);\r\n var unselected = elements.filter('.selected');\r\n elements.removeClass('selected selection');\r\n if (triggerEvent !== false && unselected.length > 0) {\r\n $(this).closest('div.originListBox').eq(0)\r\n\t\t\t\t.trigger('listboxunselected', [unselected.originListBoxItemData(), unselected.get()]);\r\n }\r\n return this;\r\n };\r\n\r\n /*\r\n * Given an array of values, select all of the elements and trigger the listboxselected event\r\n * passing in the elements selected in the order they appeared in the values array (as passed in by \r\n * the developer).\r\n */\r\n $.fn.originListBoxSelect = function (values, triggerEvent, preserveOrder) {\r\n var elements = filterElementsByValues.call(this, values, preserveOrder !== false);\r\n elements\r\n\t\t\t.removeClass('selection')\r\n\t\t\t.addClass('selected');\r\n if (triggerEvent !== false && elements.length > 0) {\r\n $(this).closest('div.originListBox').eq(0)\r\n\t\t\t\t.trigger('listboxselected', [elements.originListBoxItemData(), elements.get()]);\r\n }\r\n return this;\r\n };\r\n\r\n /*\r\n * Enable the sortable option for listboxes by the user.\r\n */\r\n $.fn.originListBoxUserSortable = function (enable) {\r\n return this.each(function () {\r\n var options = $(this).data('options');\r\n if (enable !== false) {\r\n options.sortable = true;\r\n $(this)\r\n\t\t\t\t\t.originListBoxSelectable(false)\r\n\t\t\t\t\t.find('> ul')\r\n\t\t\t\t\t\t.sortable({\r\n\t\t\t\t\t\t axis: 'y',\r\n\t\t\t\t\t\t tollerance: 'pointer',\r\n\t\t\t\t\t\t cursor: 'crosshair',\r\n\t\t\t\t\t\t start: function (evt, ui) {\r\n\t\t\t\t\t\t $(ui.item).addClass('sortable');\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\t stop: function (evt, ui) {\r\n\t\t\t\t\t\t $(ui.item).removeClass('sortable');\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\t update: function (evt, ui) {\r\n\t\t\t\t\t\t var div = $(this).parents('div.originListBox');\r\n\t\t\t\t\t\t var items = $('> ul > li:visible', div);\r\n\t\t\t\t\t\t div.trigger('listboxsorted', [items.originListBoxItemData(), items.get()]);\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t});\r\n } else {\r\n options.sortable = false;\r\n $(this)\r\n\t\t\t\t\t.originListBoxSelectable(options.selectable)\r\n\t\t\t\t\t.find('> ul')\r\n\t\t\t\t\t\t.sortable('destroy');\r\n }\r\n $(this).data('options', options);\r\n });\r\n };\r\n\r\n /*\r\n * Enable the listbox (passing in false, disables the entire listbox)\r\n */\r\n $.fn.originListBoxEnabled = function (enabled) {\r\n if (enabled !== true && enabled !== false) {\r\n return !$(this).hasClass('originListBoxDisabled');\r\n }\r\n\r\n return this.each(function () {\r\n var options = $(this).data('options');\r\n if (!$(this).hasClass('originListBoxDisabled') != enabled) {\r\n if (enabled === false) {\r\n $(this).addClass('originListBoxDisabled');\r\n\r\n // Make list selectable\r\n if (options.selectable === true) {\r\n $(this).originListBoxSelectable(false);\r\n }\r\n\r\n // Make list sortable by allowing user to click & drag\r\n if (options.sorting == 'user') {\r\n $(this).originListBoxUserSortable(false);\r\n }\r\n } else {\r\n $(this).removeClass('originListBoxDisabled');\r\n\r\n // Make list selectable\r\n if (options.selectable === true) {\r\n $(this).originListBoxSelectable(true, options.multiSelect);\r\n }\r\n\r\n // Make list sortable by allowing user to click & drag\r\n if (options.sorting == 'user') {\r\n $(this).originListBoxUserSortable(true);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n /*\r\n * This function enables the 'selectable' behavior or click + drag to \r\n * select a list of items\r\n */\r\n $.fn.originListBoxSelectable = function (enabled, multi) {\r\n return this.each(function () {\r\n if (multi === false || enabled === false) {\r\n $(this).unbind('.multiselect');\r\n }\r\n\r\n if (enabled === false) {\r\n $(this).unbind('.selectable');\r\n } else {\r\n $(this)\r\n\t\t\t\t\t.data('selection', null)\r\n\t\t\t\t\t.bind('selectstart.selectable', function () {\r\n\t\t\t\t\t return false;\r\n\t\t\t\t\t});\r\n if (multi === false) {\r\n $(this)\r\n\t\t\t\t\t.bind('click.selectable', function (evt) {\r\n\t\t\t\t\t if ($(evt.target).is('a')) {\r\n\t\t\t\t\t return;\r\n\t\t\t\t\t }\r\n\t\t\t\t\t var options = $(this).data('options');\r\n\t\t\t\t\t $('li.selection', this).removeClass('selection');\r\n\t\t\t\t\t var li = $(evt.target).closest('li');\r\n\t\t\t\t\t if (li.parents('.originListBox').length == 1 && li.length > 0) {\r\n\t\t\t\t\t var maxSelected = (options.maxSelection > -1 && $('> ul > li.selected:visible', this).length + 1 > options.maxSelection);\r\n\t\t\t\t\t if (li.hasClass('selected') || !maxSelected) {\r\n\t\t\t\t\t li.toggleClass('selected');\r\n\t\t\t\t\t $(this).trigger(li.hasClass('selected') ? 'listboxselected' : 'listboxunselected', [li.originListBoxItemData(), li.get()]);\r\n\t\t\t\t\t } else if (maxSelected) {\r\n\t\t\t\t\t if (options.maxSelection == 1) {\r\n\t\t\t\t\t li.siblings('.selected:visible').removeClass('selected');\r\n\t\t\t\t\t li.addClass('selected');\r\n\t\t\t\t\t $(this).trigger('listboxselected', [li.originListBoxItemData(), li.get()]);\r\n\t\t\t\t\t } else {\r\n\t\t\t\t\t alert('You have reached the max number of selections (' + options.maxSelection + ')');\r\n\t\t\t\t\t }\r\n\t\t\t\t\t }\r\n\t\t\t\t\t }\r\n\t\t\t\t\t});\r\n }\r\n\r\n if (multi !== false) {\r\n $(this)\r\n\t\t\t\t\t\t.bind('mousedown.multiselect', function (evt) {\r\n\t\t\t\t\t\t if ($(evt.target).is('a') || this == evt.target) {\r\n\t\t\t\t\t\t return;\r\n\t\t\t\t\t\t }\r\n\r\n\t\t\t\t\t\t var options = $(this).data('options');\r\n\t\t\t\t\t\t var items = $('> ul > li:visible', this);\r\n\t\t\t\t\t\t var li = $(evt.target).closest('li');\r\n\r\n\t\t\t\t\t\t // We detect a selection when the user keeps their mouse down and mouses out\r\n\t\t\t\t\t\t // of this element box (sets selection to active) We only need this event once\r\n\t\t\t\t\t\t $(this)\r\n\t\t\t\t\t\t\t\t.data('selection', {\r\n\t\t\t\t\t\t\t\t items: items,\r\n\t\t\t\t\t\t\t\t start: items.index(li[0]),\r\n\t\t\t\t\t\t\t\t invert: li.hasClass('selected'),\r\n\t\t\t\t\t\t\t\t max: options.maxSelection,\r\n\t\t\t\t\t\t\t\t selected: $(li[0])\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.addClass('mouseisdown');\r\n\r\n\t\t\t\t\t\t // Unbind and rebind the event\r\n\t\t\t\t\t\t $(document)\r\n\t\t\t\t\t\t\t\t.unbind('mouseup.listboxselectable')\r\n\t\t\t\t\t\t\t\t.connect('mouseup.listboxselectable', this, 'mouseupx');\r\n\r\n\t\t\t\t\t\t $(evt.target).closest('li')\r\n\t\t\t\t\t\t\t\t.removeClass('hover')\r\n\t\t\t\t\t\t\t\t.addClass('selection');\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.bind('mouseup.multiselect mouseupx.multiselect', function (evt, source) {\r\n\t\t\t\t\t\t // Stopping propagation is critical since we're re-dispatching mouseup events from the document\r\n\t\t\t\t\t\t evt.stopPropagation();\r\n\t\t\t\t\t\t evt.stopImmediatePropagation();\r\n\t\t\t\t\t\t // Do not prevent default or it will disable all clicks\r\n\r\n\t\t\t\t\t\t $(this).removeClass('mouseisdown');\r\n\t\t\t\t\t\t // Unbind our global mouseup listener\r\n\t\t\t\t\t\t $(document).unbind('mouseup.listboxselectable');\r\n\r\n\t\t\t\t\t\t var selection = $(this).data('selection');\r\n\t\t\t\t\t\t if (selection !== null) {\r\n\t\t\t\t\t\t $(this).data('selection', null);\r\n\t\t\t\t\t\t evt.preventDefault();\r\n\t\t\t\t\t\t // (Un)select the items collected\r\n\t\t\t\t\t\t $(selection.selected)['originListBox' + (selection.invert ? 'Unselect' : 'Select')]();\r\n\r\n\t\t\t\t\t\t // Prevent the click event from firing\r\n\t\t\t\t\t\t return false;\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.bind('mouseover.multiselect', function (evt) {\r\n\t\t\t\t\t\t var selection = $(this).data('selection');\r\n\t\t\t\t\t\t if (selection !== null) {\r\n\t\t\t\t\t\t evt.stopPropagation();\r\n\t\t\t\t\t\t evt.stopImmediatePropagation();\r\n\r\n\t\t\t\t\t\t var selected = $('> ul > li.selected', this);\r\n\t\t\t\t\t\t var union = selected.filter('.selection');\r\n\t\t\t\t\t\t selected = selected.not('.selection');\r\n\t\t\t\t\t\t var current = selection.items.index($(evt.target).closest('li'));\r\n\r\n\t\t\t\t\t\t if (current > -1) {\r\n\t\t\t\t\t\t var start = (selection.start < current ? selection.start : current);\r\n\t\t\t\t\t\t var end = (selection.start < current ? current : selection.start);\r\n\r\n\t\t\t\t\t\t // Limit our selection if a selection.max option has been set\r\n\t\t\t\t\t\t var max = selection.max;\r\n\t\t\t\t\t\t var total = (end - start) + selected.length - union.length;\r\n\t\t\t\t\t\t if (max > -1 && (selected.length >= max || (end - start) >= max || total >= max)) {\r\n\t\t\t\t\t\t // Add(Subtract) 1 from selection.max because the item we're currently over \r\n\t\t\t\t\t\t // is max + 1\r\n\t\t\t\t\t\t if (selection.start == start) {\r\n\t\t\t\t\t\t end = selection.start + (max - selected.length) - 1;\r\n\t\t\t\t\t\t } else {\r\n\t\t\t\t\t\t start = selection.start - (max - selected.length) + 1;\r\n\t\t\t\t\t\t end = selection.start;\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t selection.selected = selection.items.slice(start, (end + 1));\r\n\r\n\t\t\t\t\t\t $(this).data('selection', selection);\r\n\t\t\t\t\t\t selection.items.removeClass('selection');\r\n\t\t\t\t\t\t selection.selected.addClass('selection');\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t});\r\n }\r\n }\r\n });\r\n };\r\n\r\n /*\r\n * This method takes two list boxes and binds their events and behaviors together so that \r\n * removing an item from one list box adds it to the second and vice versa. \r\n */\r\n $.fn.originDualListBox = function (options, targetOptions) {\r\n return this.each(function () {\r\n var source = this;\r\n\r\n var sort = options.sorting && arguments.length == 1 ? options.sorting : (targetOptions && targetOptions.sorting || 'none');\r\n options = $.extend({\r\n remove: false,\r\n // 'remove' or 'select'\r\n listMode: 'select',\r\n filterInput: null,\r\n sorting: 'auto',\r\n formatData: null\r\n }, options || {}, {\r\n sorting: options.sorting && arguments.length == 2 ? options.sorting : 'auto'\r\n });\r\n\r\n $(source)\r\n\t\t\t\t.originListBox(options)\r\n\t\t\t\t.bind('listboxselected', function (evt, items, elements) {\r\n\t\t\t\t log('dualistbox: source:listboxselected');\r\n\t\t\t\t if (options.listMode == 'remove') {\r\n\t\t\t\t $(elements).remove();\r\n\t\t\t\t }\r\n\t\t\t\t $(options.target).originListBoxAdd(items);\r\n\t\t\t\t})\r\n\t\t\t\t.bind('listboxunselected', function (evt, items, elements) {\r\n\t\t\t\t log('dualistbox: source:listboxUNselected');\r\n\t\t\t\t $(options.target).originListBoxRemove(items, false);\r\n\t\t\t\t})\r\n\t\t\t\t.bind('listboxadded', function () {\r\n\t\t\t\t // We've added new elements to our source listbox (the availble choices)\r\n\t\t\t\t // Grab the values from the selected box and select any in our source box \r\n\t\t\t\t // if they exist\r\n\t\t\t\t $(this).originListBoxSelect($(options.target).originListBoxValues(), false);\r\n\t\t\t\t});\r\n\r\n targetOptions = $.extend({\r\n sorting: sort,\r\n remove: true, // Add a remove link\r\n selectable: true, // User is able to select\r\n dataUrl: null,\r\n postData: null,\r\n selected: null,\r\n sortBy: options.sortBy, \t// Set the sort options from the available listbox\r\n sortType: options.sortType,\r\n formatData: options.formatData\r\n }, targetOptions || {});\r\n\r\n $(options.target)\r\n\t\t\t\t.addClass('originListBoxSelected')\r\n\t\t\t\t.originListBox(targetOptions)\r\n\t\t\t\t.bind('listboxselected', function (evt, items, elements) {\r\n\t\t\t\t log('dualistbox: target:listboxselected');\r\n\t\t\t\t $(elements).originListBoxRemove();\r\n\t\t\t\t})\r\n\t\t\t\t.bind('listboxremoved', function (evt, items, elements) {\r\n\t\t\t\t log('dualistbox: target:listboxremoved');\r\n\t\t\t\t if (options.listMode == 'remove') {\r\n\t\t\t\t $(source).originListBoxAdd(items, true);\r\n\t\t\t\t } else if (options.listMode == 'select') {\r\n\t\t\t\t $(source).originListBoxUnselect(items);\r\n\t\t\t\t }\r\n\t\t\t\t});\r\n });\r\n };\r\n})(jQuery);\r\n\r\n(function (Origin) {\r\n\t/*\r\n\t* This is a utility method that wrapps originDualListBox() and also generates the additional HTML\r\n\t* markup including layout of the two listboxes.\r\n\t*/\r\n\tOrigin.dualListBox = function (id, inOptions) {\r\n\t\tvar element = $('#' + id);\r\n\t\tvar data = element.dataset();\r\n\t\tvar options = $.extend({\r\n\t\t\tautoInit: data.autoInit !== 'false',\r\n\t\t\tdataUrl: data.dataUrl || null,\r\n\t\t\tpostData: data.postData || null,\r\n\t\t\tsorting: data.sorting || 'auto', \t// auto, user (click & move), none\r\n\t\t\tsortBy: data.sortBy || 'label',\r\n\t\t\tsortType: data.sortType || null,\r\n\t\t\tselected: (data.selected ? data.selected.split(/\\s*,\\s*/) : null),\r\n\t\t\ttarget: '#' + id,\r\n\t\t\tfilterInput: (data.filter ? '#' + data.filter : null),\r\n\t\t\tsourceLabel: 'Available',\r\n\t\t\ttargetLabel: 'Selected',\r\n\t\t\tdataType: data.dataType\r\n\t\t}, inOptions || {});\r\n\t\tdata.target = id;\r\n\t\tvar selectedOptions = {\r\n\t\t\tsorting: options.sorting,\r\n\t\t\tsortType: options.sortType,\r\n\t\t\tsortBy: options.sortBy\r\n\t\t};\r\n\t\tvar filter = spacer = '';\r\n\t\tif (options.filterInput && $(options.filterInput).length == 0) {\r\n\t\t\t// We have an input filter to add\r\n\t\t filter = '';\r\n\t\t\tspacer = '';\r\n\t\t}\r\n\r\n\t\tvar template = '
'\r\n\t\t\t\t\t+ '{3}
'\r\n\t\t\t\t\t+ '{4}
';\r\n\r\n\t\tvar classAttr = \"\";\r\n\t\tif (element.hasClass(\"emptyOnClearAll\"))\r\n\t\t\tclassAttr = 'class=\"emptyOnClearAll\"';\r\n\t\t$('#' + id).after(Origin.formatString(template, id, options.sourceLabel, options.targetLabel, filter, spacer, classAttr)).remove();\r\n\r\n\t\t$('#' + id).dataset(data);\r\n\r\n\t\treturn $('#available' + id)\r\n\t\t\t\t\t.originDualListBox(options, selectedOptions)\r\n\t\t\t\t\t.closest('.originDualListBox').dataset(data)[0];\r\n\t};\r\n})(Origin);","/*\r\n*\r\n*\tAUTHOR : Jay Brummels\r\n* DATE : 4/2/10\r\n* VERSION : 1.4\r\n* USE: Appends a pager to the page with a previous and next button that scroll through the pages to the max value passed in.\r\n* The longer you hold the button down the faster it goes through the pages\r\n* When Clicked the links fire a pageChanged event and passes back the page.\r\n*/\r\n(function ($, obj) {\r\n\t$.extend(obj, {\r\n\t\tpagerEnabled: function (enabled, pagerInstance) {\r\n\t\t\t// Todo add pagerInstance property\r\n\t\t\t$('div.pager').parent().pagerSetEnabled(enabled);\r\n\t\t}\r\n\t});\r\n\r\n\t$.fn.pagingBar = function (options) {\r\n\t\toptions = $.extend({\r\n\t\t\tactionLabel: 'Page',\r\n\t\t\trecordType: 'records',\r\n\t\t\tfirstLast: true,\r\n\t\t\ttotal: 0,\r\n\t\t\tcurrent: null,\r\n\t\t\tinstance: null,\r\n\t\t\thistory: false\r\n\t\t}, options);\r\n\r\n\t\treturn this.each(function () {\r\n\t\t\tvar first = $('
«|
')\r\n\t\t\t\t\t\t\t.click(function (evt) {\r\n\t\t\t\t\t\t\t\tvar $pager = $(this).closest('.pager').parent();\r\n\t\t\t\t\t\t\t\tif ($pager.data('current') != 1)\r\n\t\t\t\t\t\t\t\t\t$pager.pagerPage(1);\r\n\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tvar last = $('
')\r\n\t\t\t\t\t\t\t.click(function (evt) {\r\n\t\t\t\t\t\t\t\tvar $pager = $(this).closest('.pager').parent();\r\n\t\t\t\t\t\t\t\tvar max = $pager.pagerMax();\r\n\t\t\t\t\t\t\t\tif ($pager.data('current') != max)\r\n\t\t\t\t\t\t\t\t\t$pager.pagerPage(max);\r\n\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t$(this)\r\n\t\t\t\t.If(options.history)\r\n\t\t\t\t\t.addClass('pagerHistoryEnabled')\r\n\t\t\t\t\t.bind('pageChanged', function (evt, page) {\r\n\t\t\t\t\t\tlog('pageChanged, adding history: ' + page);\r\n\t\t\t\t\t\tOrigin.addHistory('page=' + page);\r\n\t\t\t\t\t})\r\n\t\t\t\t.end()\r\n\t\t\t\t.If(options.instance != null)\r\n\t\t\t\t\t.data('pagerInstance', options.instance)\r\n\t\t\t\t.end()\r\n\t\t\t\t.pager(options.total, options.current)\r\n\t\t\t\t.append('
  ' + options.actionLabel + ' ' + (options.current ? options.current : '-') + ' of '\r\n\t\t\t\t\t\t+ '' + (options.total == 0 ? '-' : options.total) + '
')\r\n\t\t\t\t.find('> div.pager')\r\n\t\t\t\t\t.find('> span')\r\n\t\t\t\t\t\t.remove()\r\n\t\t\t\t\t.end()\r\n\t\t\t\t\t.find('div.button')\r\n\t\t\t\t\t\t.attr('title', 'Hold down to quickly scroll through ' + options.recordType)\r\n\t\t\t\t\t.end()\r\n\t\t\t\t\t.If(options.firstLast)\r\n\t\t\t\t\t\t.prepend(first)\r\n\t\t\t\t\t\t.append(last);\r\n\r\n\t\t\tvar _this = this;\r\n\t\t\tOrigin.onData('totalPageCount', function (totalPageCount, instance) {\r\n\t\t\t\tvar pi = $(_this).data('pagerInstance');\r\n\t\t\t\tif (!pi || (pi && instance && pi == instance)) {\r\n\t\t\t\t\t$(_this).pagerMax(totalPageCount);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif (options.history) {\r\n\t\t\t\tOrigin.onHistory(function (data) {\r\n\t\t\t\t\tif (data.params.page) {\r\n\t\t\t\t\t\tvar page = $(_this).pagerPage();\r\n\t\t\t\t\t\tif (page != data.params.page) {\r\n\t\t\t\t\t\t\t$(_this).pagerPage(data.params.page);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\t$.fn.pager = function (max, current) {\r\n\t\tvar xl;\r\n\t\treturn this.each(function () {\r\n\t\t\tvar $self = $(this);\r\n\t\t\t$self\r\n\t\t\t\t.data('max', 1)\r\n\t\t\t\t.data('current', 1)\r\n\t\t\t\t.bind('tryPageChanged', function (evt, page) {\r\n\t\t\t\t\tif ($self.data('current') != page) {\r\n\t\t\t\t\t\t$self\r\n\t\t\t\t\t\t\t.data('current', page)\r\n\t\t\t\t\t\t\t.trigger('pageChanged', [page]);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.append('
«
»
')\r\n\t\t\t\t.find('div.pager > div')\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\t'float': 'left'\r\n\t\t\t\t\t})\r\n\t\t\t\t.end()\r\n\t\t\t\t.find('div.pager > div.page')\r\n\t\t\t\t\t.data('page', 1)\r\n\t\t\t\t\t.text(1)\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\t'width': (parseInt($self.pagerMax().toString().length) * 10) + 'px',\r\n\t\t\t\t\t\t'text-align': 'center',\r\n\t\t\t\t\t\t'margin': '0 .5em'\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.bind('mouseenter.pager mouseleave.pager', function (evt) {\r\n\t\t\t\t\t\t$(this)[evt.type == 'mouseenter' ? 'addClass' : 'removeClass']('hover');\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.bind('click.pager', function (evt) {\r\n\t\t\t\t\t\tvar $page = $('div.page', $self);\r\n\t\t\t\t\t\tif (!$(this).hasClass('disabled')) { //don't run if its been disabled.\r\n\t\t\t\t\t\t\t$self.pagerSetEnabled(false); //disable the buttons\r\n\t\t\t\t\t\t\tvar $page = $(this);\r\n\t\t\t\t\t\t\tvar $input = $('')\r\n\t\t\t\t\t\t\t\t.css({\r\n\t\t\t\t\t\t\t\t\t'width': (parseInt($self.pagerMax().toString().length) * 10) + 'px',\r\n\t\t\t\t\t\t\t\t\t'margin': '0 1em',\r\n\t\t\t\t\t\t\t\t\t'float': 'left'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t\t\t\t'autocomplete': 'off',\r\n\t\t\t\t\t\t\t\t\t'maxlength': $self.pagerMax().toString().length\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.hide();\r\n\t\t\t\t\t\t\t$page\r\n\t\t\t\t\t\t\t\t.after($input)\r\n\t\t\t\t\t\t\t\t.hide();\r\n\t\t\t\t\t\t\t$input\r\n\t\t\t\t\t\t\t\t.fadeIn('slow')\r\n\t\t\t\t\t\t\t\t.focus()\r\n\t\t\t\t\t\t\t\t.bind('blur.pager', function (evt) {\r\n\t\t\t\t\t\t\t\t\t$(this).remove();\r\n\t\t\t\t\t\t\t\t\t$page.removeClass('hover').fadeIn('slow');\r\n\t\t\t\t\t\t\t\t\t$self.pagerSetEnabled(true);\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.bind('keydown.pager', function (evt) {\r\n\t\t\t\t\t\t\t\t\tswitch (evt.keyCode) {\r\n\t\t\t\t\t\t\t\t\t\tcase 9: // tab\r\n\t\t\t\t\t\t\t\t\t\tcase 13: // return\r\n\t\t\t\t\t\t\t\t\t\t\tevt.preventDefault();\r\n\t\t\t\t\t\t\t\t\t\t\t// check that values is between 1 and max and then set page and enable again, else add class error\r\n\t\t\t\t\t\t\t\t\t\t\tvar value = $(this).val();\r\n\t\t\t\t\t\t\t\t\t\t\tif (parseInt(value, 10) == value && value >= 1 && value <= $self.data('max')) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t$(this).remove();\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar current = $self.data('current');\r\n\t\t\t\t\t\t\t\t\t\t\t\t$self\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t.pagerPage(value, current != value)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t.pagerSetEnabled(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t$page.removeClass('hover').fadeIn('slow');\r\n\t\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t$(this).addClass('error');\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\tcase 27: // escape key\r\n\t\t\t\t\t\t\t\t\t\t\t// remove input and show the page number, enable again\r\n\t\t\t\t\t\t\t\t\t\t\t$(this).remove();\r\n\t\t\t\t\t\t\t\t\t\t\t$page.removeClass('hover').fadeIn('slow');\r\n\t\t\t\t\t\t\t\t\t\t\t$self.pagerSetEnabled(true);\r\n\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\t\t\tif (evt.charCode) { //if not a character don't allow it\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar character = String.fromCharCode(evt.charCode);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (character.match(/^[0-9]*$/) === null) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tevt.preventDefault(); //if not a number don't allow it\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t.end()\r\n\t\t\t\t.find('div.pager > span')\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\t'clear': 'both'\r\n\t\t\t\t\t})\r\n\t\t\t\t.end()\r\n\t\t\t\t.find('div.pager > div.button')\r\n\t\t\t\t\t.bind('mouseenter.pager mouseleave.pager', function (evt) {\r\n\t\t\t\t\t\t$(this)[evt.type == 'mouseenter' ? 'addClass' : 'removeClass']('hover');\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.bind('mousedown.pager', function (evt) {\r\n\t\t\t\t\t\tvar $page = $('div.page', $self);\r\n\t\t\t\t\t\tif (!$(this).hasClass('disabled')) { //don't run if its been disabled.\r\n\t\t\t\t\t\t\t$(document).disableSelection();\r\n\t\t\t\t\t\t\t$(document).bind('mouseup.pager', function () {\r\n\t\t\t\t\t\t\t\tclearTimeout(xl);\r\n\t\t\t\t\t\t\t\toriginTimer.start(function () {\r\n\t\t\t\t\t\t\t\t\tclearTimeout(xl);\r\n\t\t\t\t\t\t\t\t\t$self.trigger('tryPageChanged', [$page.data('page')]);\r\n\t\t\t\t\t\t\t\t\t$(document).unbind('mouseup.pager');\r\n\t\t\t\t\t\t\t\t\t$(document).enableSelection();\r\n\t\t\t\t\t\t\t\t}, 300);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tvar $button = $(this);\r\n\t\t\t\t\t\t\tvar times = 1;\r\n\t\t\t\t\t\t\tvar func = function () {\r\n\t\t\t\t\t\t\t\tvar doTimer = false;\r\n\t\t\t\t\t\t\t\tif ($button.is('div.next')) {\r\n\t\t\t\t\t\t\t\t\tif ($page.data('page') < $self.data('max')) {\r\n\t\t\t\t\t\t\t\t\t\t$page.data('page', $page.data('page') + 1);\r\n\t\t\t\t\t\t\t\t\t\tdoTimer = true;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tif ($page.data('page') > 1) {\r\n\t\t\t\t\t\t\t\t\t\t$page.data('page', $page.data('page') - 1);\r\n\t\t\t\t\t\t\t\t\t\tdoTimer = true;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\ttimes += 1;\r\n\t\t\t\t\t\t\t\t$page.text($page.data('page'));\r\n\t\t\t\t\t\t\t\tif (doTimer) { //dont do if at max or 1\r\n\t\t\t\t\t\t\t\t\txl = setTimeout(func, times < 10 ? 250 - (times * 10) : 50);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tfunc();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t.end()\r\n\t\t\tif (max) {\r\n\t\t\t\t$self.pagerMax(max);\r\n\t\t\t}\r\n\t\t\tif (current) {\r\n\t\t\t\t$self.pagerPage(current, false);\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\t// set whether or not the page is enabled.\r\n\t$.fn.pagerSetEnabled = function (enabled) {\r\n\t\treturn this.each(function () {\r\n\t\t\t$(this).find('div.pager > div')[(enabled === false) ? 'addClass' : 'removeClass']('disabled');\r\n\t\t});\r\n\t};\r\n\r\n\t$.fn.pagerPage = function (page, triggerPageChangedFlag) {\r\n\t\tif (page === undefined) {//if page is not passed in return the actual page number\r\n\t\t\treturn this.eq(0).find('div.pager > div.page').data('page');\r\n\t\t} else { //set the actual page number\r\n\t\t\tpage = parseInt(page, 10) || 1; //if page is not a number set it to 1 \r\n\t\t\treturn this.each(function () {\r\n\t\t\t\tpage = page > $(this).pagerMax() ? $(this).pagerMax() : page; //if it greater than the max then set to max\r\n\t\t\t\tpage = page < 1 ? 1 : page; //if page is less than one then set to 1\r\n\r\n\t\t\t\t$(this)\r\n\t\t\t\t\t.data('current', page)\r\n\t\t\t\t\t.find('div.pager > div.page')\r\n\t\t\t\t\t.data('page', page)\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\t'width': (parseInt(page.toString().length) * 10) + 'px'\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.text(page);\r\n\t\t\t\tif (triggerPageChangedFlag !== false) {\r\n\t\t\t\t\t$(this).trigger('pageChanged', [page]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.pagerMax = function (max) {\r\n\t\tif (max === undefined) {//if page is not passed in return the actual page number\r\n\t\t\treturn this.eq(0).data('max');\r\n\t\t} else { //set the actual page number\r\n\t\t\treturn this.each(function () {\r\n\t\t\t\tvar $self = $(this);\r\n\t\t\t\tmax = parseInt(max, 10) || $(this).data('max'); //if max is not a number set it to old max \r\n\t\t\t\tmax = max < 1 ? 1 : max; //if max is less than one then set to 1\r\n\r\n\t\t\t\t// Set the width based on the text\r\n\t\t\t\tvar pagerPage = $self.pagerPage();\r\n\t\t\t\tvar pagerText = pagerPage !== undefined && pagerPage !== null ? pagerPage : max;\r\n\t\t\t\tvar width = (parseInt(pagerText.toString().length) * 10) + 'px';\r\n\r\n\t\t\t\t$self\r\n\t\t\t\t\t.removeClass('pagerHidden')\r\n\t\t\t\t\t.data('max', max) //set the data\r\n\t\t\t\t\t.find('div.pager > div.page') // make sure the width stays consitent up to the max\r\n\t\t\t\t\t\t.css({\r\n\t\t\t\t\t\t\t'width': ''\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.text(max)\r\n\t\t\t\t\t\t.css({\r\n\t\t\t\t\t\t\t'width': width\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.text($self.pagerPage());\r\n\r\n\t\t\t\tif (max == 1) {\r\n\t\t\t\t\t$self.addClass('pagerHidden');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.pagerUnbind = function () {\r\n\t\treturn this.each(function () {\r\n\t\t\t$('div.pager *', $(this)).unbind('.pager');\r\n\t\t});\r\n\t};\r\n\r\n\t$.fn.pagerDestroy = function () {\r\n\t\treturn this.each(function () {\r\n\t\t\t$(this).find('div.pager').remove();\r\n\t\t});\r\n\t};\r\n})(jQuery, Origin);\r\n\r\n","(function ($) {\r\n\t/*\r\n\t* This portlet code adds in support for drag and drop and makes heavy use of groupbox events for \r\n\t* manipulating individual portlets. The portlet code below has nothing to do with actual persistence\r\n\t* of the portlets state. It provides an event (portletsavepreferences) that is triggered when state \r\n\t* is updated that can then be serialized and sent back to the server for persistence. This code has \r\n\t* nothing to do though with restoring state, that occurs server side in rendering the portlets.\r\n\t*/\r\n\t$.fn.initPortlets = function () {\r\n\r\n\t\t/* HOT FIX for IE 9 for jquery sortable source http://forum.jquery.com/topic/jquery-ui-sortable-and-draggable-do-not-work-in-ie9 */\r\n\t\tvar a = $.ui.mouse.prototype._mouseMove;\r\n\t\t$.ui.mouse.prototype._mouseMove = function (b) {\r\n\t\t\tif ($.browser.msie && document.documentMode >= 9) {\r\n\t\t\t\tb.button = 1;\r\n\t\t\t}\r\n\t\t\ta.apply(this, [b]);\r\n\t\t};\r\n\t\t/*******************/\r\n\t\t/* This handles interaction between the individual portlets (and their groupbox sub control)\r\n\t\t* this in turn exposes a few additional events \r\n\t\t* such as: portletupdated, portletcollapse, portletexpand, portletremove, portletadd\r\n\t\t* The detailPageSidebar then binds to these events to update its visual state\r\n\t\t*/\r\n\t\treturn this.each(function () {\r\n\t\t\t$(this)\r\n\t\t\t\t.sortable({\r\n\t\t\t\t\tcancel: '.groupboxControls, .groupboxBody',\r\n\t\t\t\t\thelper: 'clone',\r\n\t\t\t\t\titems: 'div.portlet',\r\n\t\t\t\t\tupdate: function (evt, ui) {\r\n\t\t\t\t\t\t$(this).trigger('portletupdated');\r\n\t\t\t\t\t},\r\n\t\t\t\t\tchange: function () {\r\n\t\t\t\t\t\t$(this).trigger('portletupdatelayout');\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstart: function (evt, ui) {\r\n\t\t\t\t\t\t$(this).addClass('portletSorting');\r\n\t\t\t\t\t\t$('
 
').css('height', ($(ui.helper).find('div.groupbox').innerHeight() - 0) + 'px').appendTo(ui.placeholder);\r\n\r\n\t\t\t\t\t\t//$(this).trigger('portletupdatelayout');\r\n\t\t\t\t\t\t//$(ui.placeholder).css({ 'background': 'pink', 'visibility': 'visible' });\r\n\t\t\t\t\t},\r\n\t\t\t\t\tbeforeStop: function () {\r\n\t\t\t\t\t\t$(this).removeClass('portletSorting');\r\n\r\n\t\t\t\t\t\t//$(this).trigger('portletupdatelayout');\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstop: function () {\r\n\t\t\t\t\t\t$(arguments[1].item).trigger('sortingStopped');\r\n\t\t\t\t\t},\r\n\t\t\t\t\topacity: 0.75\r\n\t\t\t\t})\r\n\t\t\t\t.bind('groupboxexpand', function (evt, force) {\r\n\t\t\t\t\tvar $portlet = $(evt.target).closest('.portlet');\r\n\t\t\t\t\tvar kls = $portlet.hasClass('expand-to-full') ? 'full' : 'expanded';\r\n\t\t\t\t\t$portlet[arguments.length == 2 ? (force === true ? 'addClass' : 'removeClass') : 'toggleClass'](kls);\r\n\t\t\t\t\t$(this).trigger('portletexpand', [{ id: $portlet.attr('id'), expanded: $portlet.hasClass(kls)}]);\r\n\t\t\t\t})\r\n\t\t\t\t.bind('groupboxclose', function (evt) {\r\n\t\t\t\t\tvar that = this;\r\n\t\t\t\t\t$(evt.target).closest('.portlet')\r\n\t\t\t\t\t\t.fadeOut(function () {\r\n\t\t\t\t\t\t\t$(this).addClass('portletClosed');\r\n\t\t\t\t\t\t\t$(that).trigger('portletremove', [{ id: $(this).attr('id')}]);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.bind('groupboxcollapse', function (evt, ui) {\r\n\t\t\t\t\tvar $portlet = $(evt.target).closest('.portlet');\r\n\t\t\t\t\t$(this).trigger('portletcollapse', [{ id: $portlet.attr('id'), collapsed: ui.collapsed}]);\r\n\t\t\t\t})\r\n\t\t\t\t.bind('portletactivate', function (evt, ui) {\r\n\t\t\t\t\tvar that = this;\r\n\t\t\t\t\t$('#' + ui.id)\r\n\t\t\t\t\t\t.removeClass('portletClosed')\r\n\t\t\t\t\t\t.find('div.groupbox')\r\n\t\t\t\t\t\t\t.removeClass('groupboxCollapsed')\r\n\t\t\t\t\t\t.end()\r\n\t\t\t\t\t\t.fadeIn(function () {\r\n\t\t\t\t\t\t\t$(that)\r\n\t\t\t\t\t\t\t\t.trigger('portletadd', [ui]);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.bind('portletstatechanged portletupdated portletexpand portletremove portletcollapse portletadd', function () {\r\n\t\t\t\t\tvar preferences = [];\r\n\t\t\t\t\t$('> div.portlet', this).each(function () {\r\n\t\t\t\t\t\tvar $groupbox = $('> div.groupbox', this);\r\n\t\t\t\t\t\tpreferences.push({ Id: $(this).attr('id'),\r\n\t\t\t\t\t\t\tCollapsed: $groupbox.hasClass('groupboxCollapsed'),\r\n\t\t\t\t\t\t\tClosed: $(this).hasClass('portletClosed'),\r\n\t\t\t\t\t\t\tExpanded: $(this).hasClass($(this).hasClass('expand-to-full') ? 'full' : 'expanded')\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t.trigger('portletsavepreferences', [preferences])\r\n\t\t\t\t\t\t.trigger('portletupdatelayout');\r\n\t\t\t\t})\r\n\t\t\t\t.bind('portletupdatelayout', function () {\r\n\t\t\t\t\tvar portlets = $(this).find('div.portlet').removeClass('rightColumn');\r\n\t\t\t\t\tvar po = $(this).offset();\r\n\t\t\t\t\tportlets.each(function () {\r\n\t\t\t\t\t\tif ($(this).offset().left > (po.left + 50)) {\r\n\t\t\t\t\t\t\t$(this).addClass('rightColumn');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t}).trigger('portletupdatelayout');\r\n\t};\r\n})(jQuery);","$(function () {\r\n\r\n\t\t$('.smooth-form input:text, .smooth-form select, .smooth-form textarea').not('.not-smooth-form').bind('focus', function () {\r\n\t\t\t$(this)\r\n\t\t\t\t.closest('li')\r\n\t\t\t\t\t.addClass('focus')\r\n\t\t\t\t.end()\r\n\t\t\t\t.one('blur', function () {\r\n\t\t\t\t\t$(this)\r\n\t\t\t\t\t\t.closest('li')\r\n\t\t\t\t\t\t\t.removeClass('focus')\r\n\t\t\t\t\t\t.end()\r\n\t\t\t\t\t\t.validate();\r\n\t\t\t\t});\r\n\t\t});\t\r\n\r\n\t// FORM FIELD VALIDATE\t\r\n\t/// REFACTOR [Skylar] - Refactor to use Origin.Validate like in DUSA so all the validation can be centralized.\t\r\n\t$.fn.validate = function () {\r\n\t\treturn this.each(function () {\r\n\t\t\tvar $self = $(this);\r\n\t\t\tvar validationType = $self.dataset('validationType');\r\n\t\t\tvar errorMessage = $self.dataset('errorMessage');\r\n\r\n\t\t\tvar $li = $self.closest('li');\r\n\r\n\t\t\t// Make sure validation type is set on the input\r\n\t\t\tif (!validationType || validationType == '') { // Don't do anything if the validation type is not set\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (validationType == 'notEmpty') {\r\n\t\t\t\tif (!$self.val() || !$self.val.length) {\r\n\t\t\t\t\t$li.addClass('error');\r\n\t\t\t\t\t$li.attr('title', errorMessage || 'Please enter a value.');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$li.removeClass('error');\r\n\t\t\t\t\t$li.attr('title', 'Value was entered correctly.');\r\n\t\t\t\t}\r\n\t\t\t} else if (validationType == 'email') {\r\n\t\t\t\tvar emailRegex = /^[a-zA-Z0-9._%+-]+@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,128}$/;\r\n\t\t\t\tif (emailRegex.test($.trim($self.val())) == false) {\r\n\t\t\t\t\t$li.addClass('error');\r\n\t\t\t\t\t$li.attr('title', errorMessage || 'Please enter a valid email address.');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$li.removeClass('error');\r\n\t\t\t\t\t$li.attr('title', 'Email address was entered correctly.');\r\n\t\t\t\t}\r\n\t\t\t} else if (validationType == 'phone') {\r\n\t\t\t\tvar phoneRegex = /^([0-9.)(-]+)$/;\r\n\t\t\t\tif (phoneRegex.test($.trim($self.val())) == false) {\r\n\t\t\t\t\t$li.addClass('error');\r\n\t\t\t\t\t$li.attr('title', errorMessage || 'Please enter a valid phone number.');\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$li.removeClass('error');\r\n\t\t\t\t\t$li.attr('title', 'Phone number was entered correctly.');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tlog('validation error: unknown validation type');\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n});","//fgnass.github.com/spin.js#v1.3.2\r\n\r\n/**\r\n * Copyright (c) 2011-2013 Felix Gnass\r\n * Licensed under the MIT license\r\n */\r\n(function(root, factory) {\r\n\r\n /* CommonJS */\r\n if (typeof exports == 'object') module.exports = factory()\r\n\r\n /* AMD module */\r\n else if (typeof define == 'function' && define.amd) define(factory)\r\n\r\n /* Browser global */\r\n else root.Spinner = factory()\r\n}\r\n(this, function() {\r\n \"use strict\";\r\n\r\n var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */\r\n , animations = {} /* Animation rules keyed by their name */\r\n , useCssAnimations /* Whether to use CSS animations or setTimeout */\r\n\r\n /**\r\n * Utility function to create elements. If no tag name is given,\r\n * a DIV is created. Optionally properties can be passed.\r\n */\r\n function createEl(tag, prop) {\r\n var el = document.createElement(tag || 'div')\r\n , n\r\n\r\n for(n in prop) el[n] = prop[n]\r\n return el\r\n }\r\n\r\n /**\r\n * Appends children and returns the parent.\r\n */\r\n function ins(parent /* child1, child2, ...*/) {\r\n for (var i=1, n=arguments.length; i> 1) : parseInt(o.left, 10) + mid) + 'px',\r\n top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px'\r\n })\r\n }\r\n\r\n el.setAttribute('role', 'progressbar')\r\n self.lines(el, self.opts)\r\n\r\n if (!useCssAnimations) {\r\n // No CSS animation support, use setTimeout() instead\r\n var i = 0\r\n , start = (o.lines - 1) * (1 - o.direction) / 2\r\n , alpha\r\n , fps = o.fps\r\n , f = fps/o.speed\r\n , ostep = (1-o.opacity) / (f*o.trail / 100)\r\n , astep = f/o.lines\r\n\r\n ;(function anim() {\r\n i++;\r\n for (var j = 0; j < o.lines; j++) {\r\n alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)\r\n\r\n self.opacity(el, j * o.direction + start, alpha, o)\r\n }\r\n self.timeout = self.el && setTimeout(anim, ~~(1000/fps))\r\n })()\r\n }\r\n return self\r\n },\r\n\r\n /**\r\n * Stops and removes the Spinner.\r\n */\r\n stop: function() {\r\n var el = this.el\r\n if (el) {\r\n clearTimeout(this.timeout)\r\n if (el.parentNode) el.parentNode.removeChild(el)\r\n this.el = undefined\r\n }\r\n return this\r\n },\r\n\r\n /**\r\n * Internal method that draws the individual lines. Will be overwritten\r\n * in VML fallback mode below.\r\n */\r\n lines: function(el, o) {\r\n var i = 0\r\n , start = (o.lines - 1) * (1 - o.direction) / 2\r\n , seg\r\n\r\n function fill(color, shadow) {\r\n return css(createEl(), {\r\n position: 'absolute',\r\n width: (o.length+o.width) + 'px',\r\n height: o.width + 'px',\r\n background: color,\r\n boxShadow: shadow,\r\n transformOrigin: 'left',\r\n transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',\r\n borderRadius: (o.corners * o.width>>1) + 'px'\r\n })\r\n }\r\n\r\n for (; i < o.lines; i++) {\r\n seg = css(createEl(), {\r\n position: 'absolute',\r\n top: 1+~(o.width/2) + 'px',\r\n transform: o.hwaccel ? 'translate3d(0,0,0)' : '',\r\n opacity: o.opacity,\r\n animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'\r\n })\r\n\r\n if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))\r\n ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)')))\r\n }\r\n return el\r\n },\r\n\r\n /**\r\n * Internal method that adjusts the opacity of a single line.\r\n * Will be overwritten in VML fallback mode below.\r\n */\r\n opacity: function(el, i, val) {\r\n if (i < el.childNodes.length) el.childNodes[i].style.opacity = val\r\n }\r\n\r\n })\r\n\r\n\r\n function initVML() {\r\n\r\n /* Utility function to create a VML tag */\r\n function vml(tag, attr) {\r\n return createEl('<' + tag + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"spin-vml\">', attr)\r\n }\r\n\r\n // No CSS transforms but VML support, add a CSS rule for VML elements:\r\n sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')\r\n\r\n Spinner.prototype.lines = function(el, o) {\r\n var r = o.length+o.width\r\n , s = 2*r\r\n\r\n function grp() {\r\n return css(\r\n vml('group', {\r\n coordsize: s + ' ' + s,\r\n coordorigin: -r + ' ' + -r\r\n }),\r\n { width: s, height: s }\r\n )\r\n }\r\n\r\n var margin = -(o.width+o.length)*2 + 'px'\r\n , g = css(grp(), {position: 'absolute', top: margin, left: margin})\r\n , i\r\n\r\n function seg(i, dx, filter) {\r\n ins(g,\r\n ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),\r\n ins(css(vml('roundrect', {arcsize: o.corners}), {\r\n width: r,\r\n height: o.width,\r\n left: o.radius,\r\n top: -o.width>>1,\r\n filter: filter\r\n }),\r\n vml('fill', {color: getColor(o.color, i), opacity: o.opacity}),\r\n vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change\r\n )\r\n )\r\n )\r\n }\r\n\r\n if (o.shadow)\r\n for (i = 1; i <= o.lines; i++)\r\n seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')\r\n\r\n for (i = 1; i <= o.lines; i++) seg(i)\r\n return ins(el, g)\r\n }\r\n\r\n Spinner.prototype.opacity = function(el, i, val, o) {\r\n var c = el.firstChild\r\n o = o.shadow && o.lines || 0\r\n if (c && i+o < c.childNodes.length) {\r\n c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild\r\n if (c) c.opacity = val\r\n }\r\n }\r\n }\r\n\r\n var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})\r\n\r\n if (!vendor(probe, 'transform') && probe.adj) initVML()\r\n else useCssAnimations = vendor(probe, 'animation')\r\n\r\n return Spinner\r\n\r\n}));\r\n","/*!\r\n* JsTrace - v1.3 - 3/18/2012\r\n*\r\n* Copyright (c) 2011-2102 Tom McKearney (thomas.mckearney@appliedis.com)\r\n* Dual licensed under the MIT and GPL licenses.\r\n*\r\n* Internals are based on the 'ba-debug' project by Ben Alman\r\n* http://benalman.com/projects/javascript-debug-console-log/\r\n* \r\n* ORIGINAL Copyright notice is below \r\n*\r\n* JavaScript Debug - v0.4 - 6/22/2010\r\n* http://benalman.com/projects/javascript-debug-console-log/\r\n* \r\n* Copyright (c) 2010 \"Cowboy\" Ben Alman\r\n* Dual licensed under the MIT and GPL licenses.\r\n* http://benalman.com/about/license/\r\n* \r\n* With lots of help from Paul Irish!\r\n* http://paulirish.com/\r\n*/\r\n(function (global, undefined) {\r\n \"use strict\";\r\n // private, shared members go here.\r\n var _levels = ['off', 'error', 'warn', 'info', 'debug', 'log'],\r\n _passThroughMethods = ['assert', 'clear', 'count', 'dir', 'dirxml',\r\n 'exception', 'group', 'groupCollapsed', 'groupEnd', 'profile',\r\n 'profileEnd', 'table', 'time', 'timeEnd', 'trace'],\r\n _traceLevels = {},\r\n _logMessages = [], // array for all the log messages\r\n _maxLogLength = 1000,\r\n _defaultTraceLevel = 1, // error\r\n _callbackFunc, // call for every log message (and all previous ones)\r\n _callbackForce = false, // always use callback?\r\n _con = window.console;\r\n\r\n // Declare the base object here\r\n var Trace = global.Trace = function (module, opts) {\r\n /// \r\n /// Class for switched diagnostic information\r\n /// (Must be created with \"new\" syntax)\r\n /// Provides the following logging methods:\r\n /// - error()\r\n /// - warn()\r\n /// - info()\r\n /// - debug()\r\n /// - log()\r\n /// Switch Level is changed by calling: \r\n /// - Trace.traceLevel([moduleName], Trace.Levels.[level])\r\n /// \r\n /// \r\n /// The module name\r\n /// \r\n /// \r\n /// Options variable (currently unused)\r\n /// \r\n\r\n if (!this instanceof Trace) {\r\n throw new Error('Trace object must be initialised with the \"new\" keyword.');\r\n }\r\n\r\n if (typeof module === 'undefined') {\r\n throw new Error('You must pass the module name');\r\n }\r\n\r\n // add the passthrough methods here\r\n _createPassthroughMethods(module, this);\r\n\r\n // add the level-specific methods here.\r\n _createLevelMethods(module, this);\r\n\r\n return this;\r\n };\r\n\r\n // declare public static Methods\r\n Trace.defaultLevel = function (newLevel) {\r\n /// \r\n /// set or get the default Trace Level for all modules.\r\n /// \r\n /// \r\n /// the level to set\r\n /// \r\n /// \r\n /// Gets the current Default Trace Level\r\n /// \r\n /// \r\n /// \r\n /// Sets the current Default Trace Level\r\n /// \r\n /// the level to set\r\n /// \r\n /// \r\n /// \r\n if (newLevel !== undefined) {\r\n if (newLevel === null) {\r\n throw new Error('null is an invalid trace level');\r\n }\r\n // it's a setter\r\n _defaultTraceLevel = coerceTraceLevel(newLevel);\r\n }\r\n else {\r\n return _defaultTraceLevel;\r\n }\r\n };\r\n\r\n Trace.traceLevel = function (module, newLevel, asString) {\r\n /// \r\n /// set or get the Trace Level for a particular module\r\n /// \r\n /// \r\n /// The module in question\r\n /// \r\n /// \r\n /// the level to set\r\n /// \r\n /// \r\n /// whether or not to return the value as a string\r\n /// \r\n /// \r\n /// the current Level for the module, or nothing, if newLevel is defined\r\n /// \r\n /// \r\n /// Gets the current TraceLevel\r\n /// \r\n /// The module whose Trace Level we're getting\r\n /// \r\n /// \r\n /// whether or not to return the value as a string\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Sets the value\r\n /// \r\n /// The module whose Trace Level we're setting\r\n /// \r\n /// \r\n /// the level to set\r\n /// \r\n /// \r\n /// \r\n\r\n\r\n // the parameters are declared just so we can get nice intellisense.\r\n // since we have alternate signatures, we process the params for real, here:\r\n var args = Array.prototype.slice.call(arguments);\r\n module = args.shift();\r\n newLevel = undefined;\r\n asString = false;\r\n\r\n if (args.length > 0) {\r\n if (typeof args[0] === 'boolean') {\r\n asString = args.shift();\r\n }\r\n else {\r\n newLevel = args.shift();\r\n }\r\n }\r\n if (newLevel === undefined) {\r\n // return the current level or _defaultTraceLevel if it's not set\r\n var numeric = _traceLevels[module] !== undefined ?\r\n _traceLevels[module] : _defaultTraceLevel;\r\n\r\n if (asString === true) {\r\n return _levels[numeric];\r\n }\r\n return numeric;\r\n }\r\n _traceLevels[module] = coerceTraceLevel(newLevel);\r\n };\r\n\r\n Trace.shouldTrace = function (module, level) {\r\n /// \r\n /// Returns whether or not tracing should be happening for a particular module\r\n /// and level based on the current settings.\r\n /// \r\n /// Mostly used for filtering messages in the callback from the outside.\r\n /// \r\n /// \r\n /// \r\n /// The module name.\r\n /// \r\n /// \r\n /// The level of the message to be traced.\r\n /// \r\n /// \r\n /// Whether or not messages for that module and level should be logged.\r\n /// \r\n if (typeof module === 'undefined' || module === null) {\r\n throw new Error('You must pass a module name');\r\n }\r\n if (typeof level === 'undefined' || level === null) {\r\n throw new Error('You must pass a level');\r\n }\r\n var levNum = (typeof level === 'number') ? level : _levels.indexOf(level);\r\n var should = false;\r\n if (isNaN(levNum) === true) {\r\n throw new Error('\"' + levNum + '\" is not a valid Trace Level');\r\n }\r\n else {\r\n var currLevel = Trace.traceLevel(module);\r\n should = levNum <= currLevel;\r\n }\r\n return should;\r\n };\r\n\r\n Trace.resetToDefault = function (moduleNames) {\r\n /// \r\n /// Resets the specified modules to the default level. \r\n /// If no module names are passed, all modules are reset\r\n /// \r\n /// \r\n /// \r\n /// Resets all modules to the default level. \r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Resets the specified module to the default level. \r\n /// \r\n /// \r\n /// The Module name to reset\r\n /// \r\n /// \r\n /// Additional Module name(s) to be reset\r\n /// (just keep adding them w/ commas in between)\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Resets the specified modules to the default level. \r\n /// \r\n /// \r\n /// The list of Module names to reset\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Resets the specified modules to the default level. \r\n /// \r\n /// \r\n /// The list of Module names to reset\r\n /// \r\n /// \r\n if (moduleNames === undefined) {\r\n // easy, delete them all\r\n _traceLevels = {};\r\n }\r\n else {\r\n var parmType = typeof moduleNames;\r\n if (parmType === 'string') {\r\n // use the arguments collection and get all the strings\r\n var arr = [].slice.call(arguments);\r\n\r\n for (var i = 0; i < arr.length; i += 1) {\r\n delete _traceLevels[arr[i]];\r\n }\r\n }\r\n else if (moduleNames instanceof Array) {\r\n // delete them all\r\n for (var j = 0; j < moduleNames.length; j += 1) {\r\n var name = moduleNames[j];\r\n // TODO: Do I need to bother checking for string/null here?\r\n delete _traceLevels[name];\r\n }\r\n }\r\n else {\r\n throw new Error('Invalid type passed to resetToDefault: ' + parmType);\r\n }\r\n }\r\n };\r\n\r\n Trace.setCallback = function (callback, force, limit) {\r\n /// \r\n /// Set the callback function for all trace messages in the system\r\n /// \r\n /// signature should look like:\r\n /// fn(module, level, objects)\r\n /// \r\n /// NOTE: This is called for EVERY message, without filtering\r\n /// If you need to filter, use Trace.shouldTrace() inside your callback\r\n /// \r\n /// \r\n /// The function to call for each trace message in the system.\r\n /// If no callback is passed, the current callback is removed\r\n /// \r\n /// \r\n /// If false, log to console.log if available, otherwise callback. \r\n /// If true, log to both console.log and callback. \r\n /// \r\n /// \r\n /// If specified, number of lines to limit initial callback to.\r\n /// \r\n /// \r\n /// Clears the callback function\r\n /// \r\n /// \r\n /// Sets the callback function for all trace messages\r\n /// \r\n /// The function to call for each trace message in the system\r\n /// \r\n /// signature should look like:\r\n /// fn(module, level, objects)\r\n /// \r\n /// NOTE: This is called for EVERY message, without filtering\r\n /// If you need to filter, use Trace.shouldTrace() inside your callback\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Sets the callback function for all trace messages and optionally forces\r\n /// all messages through the callback (rather than only console.* methods)\r\n /// \r\n /// \r\n /// The function to call for each trace message in the system\r\n /// \r\n /// signature should look like:\r\n /// fn(module, level, objects)\r\n /// \r\n /// NOTE: This is called for EVERY message, without filtering\r\n /// If you need to filter, use Trace.shouldTrace() inside your callback\r\n /// \r\n /// \r\n /// If false, log to console.log if available, otherwise callback.\r\n /// If true, log to both console.log and callback.\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Sets the callback function for all trace messages and limits the number of historical\r\n /// messages immediately sent\r\n /// \r\n /// \r\n /// The function to call for each trace message in the system\r\n /// \r\n /// signature should look like:\r\n /// fn(module, level, objects)\r\n /// \r\n /// NOTE: This is called for EVERY message, without filtering\r\n /// If you need to filter, use Trace.shouldTrace() inside your callback\r\n /// \r\n /// \r\n /// If specified, number of lines to limit initial callback to.\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Sets the callback function for all trace messages and optionally forces\r\n /// all messages through the callback (rather than only console.* methods)\r\n /// and limits the number of historical messages immediately sent\r\n /// \r\n /// \r\n /// The function to call for each trace message in the system\r\n /// \r\n /// signature should look like:\r\n /// fn(module, level, objects)\r\n /// \r\n /// NOTE: This is called for EVERY message, without filtering\r\n /// If you need to filter, use Trace.shouldTrace() inside your callback\r\n /// \r\n /// \r\n /// If false, log to console.log if available, otherwise callback.\r\n /// If true, log to both console.log and callback.\r\n /// \r\n /// \r\n /// If specified, number of lines to limit initial callback to.\r\n /// \r\n /// \r\n\r\n // the parameters are declared just so we can get nice intellisense.\r\n // since we have alternate signatures, we process the params for real, here:\r\n var args = Array.prototype.slice.call(arguments);\r\n var max = _logMessages.length;\r\n var func = undefined; // jslint ignore - I like initializing variables!\r\n if (args.length > 0) {\r\n func = args.shift();\r\n if (typeof func !== 'function') {\r\n var err = new Error();\r\n err.message = \"Argument Is Not a function\";\r\n throw err;\r\n }\r\n }\r\n _callbackFunc = func;\r\n _callbackForce = typeof args[0] === 'boolean' ? args.shift() : false;\r\n\r\n // get how many items to send now.\r\n var i = max; // declare iterator to be same as max (meaning: sending 0 messages)\r\n var numToReturn = max;\r\n if (typeof args[0] === 'number') {\r\n numToReturn = Math.max(args.shift(), 0); // making sure we're not negative\r\n }\r\n // reduce the index by \"numToReturn\" \r\n i -= numToReturn;\r\n\r\n while (i < max) {\r\n _executeCallback(_logMessages[i]);\r\n i += 1;\r\n }\r\n };\r\n\r\n Trace.logLength = function (newMax) {\r\n /// \r\n /// Sets/Gets the maximum log length (default: 1000)\r\n /// \r\n /// \r\n /// The new maximum number\r\n /// \r\n /// \r\n /// \r\n /// Gets the current maximum log length (default: 1000)\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// Sets the current maximum log length (default: 1000)\r\n /// \r\n /// \r\n /// The new maximum log length\r\n /// \r\n /// \r\n if (typeof newMax === 'undefined') {\r\n return _maxLogLength;\r\n }\r\n if (isNaN(newMax) === true) {\r\n throw new Error('This is not a number:' + newMax);\r\n }\r\n if (newMax < 0) {\r\n throw new Error('Maxium log length must be >= 0');\r\n }\r\n _maxLogLength = newMax;\r\n var diff = _logMessages.length - _maxLogLength;\r\n if (diff > 0) {\r\n // cut that many off the front\r\n _logMessages = _logMessages.slice(diff);\r\n }\r\n };\r\n\r\n // declare the collection of Levels variables here\r\n Trace.Levels = (function () {\r\n /// \r\n /// All the available Trace Levels for a module\r\n /// \r\n /// \r\n /// All logging is off\r\n /// \r\n /// \r\n /// All error messages will be logged\r\n /// \r\n /// \r\n /// All error and warning messages will be logged\r\n /// \r\n /// \r\n /// All error, warning and info messages will be logged\r\n /// \r\n /// \r\n /// All error, warning, info and debug messages will be logged\r\n /// \r\n /// \r\n /// All error, warning, info, debug and log messages will be logged\r\n /// \r\n\r\n var allLevels = {};\r\n // loop over the levels \r\n // create a member with that level name equal to that index value\r\n var idx = _levels.length - 1;\r\n while (idx >= 0) {\r\n allLevels[_levels[idx]] = idx;\r\n idx -= 1; // decrement\r\n }\r\n\r\n return allLevels;\r\n } ());\r\n\r\n //#region Private Methods\r\n\r\n function _executeCallback(args) {\r\n if (_callbackFunc && (_callbackForce || !_con || !_con.log)) {\r\n _callbackFunc.apply(window, args);\r\n }\r\n }\r\n function _saveLogMessage(args) {\r\n _logMessages.push(args);\r\n if (_logMessages.length > _maxLogLength) {\r\n _logMessages.shift();\r\n }\r\n }\r\n function _createPassthroughMethods(module, that) {\r\n var idx = _passThroughMethods.length;\r\n while (idx >= 0) {\r\n (function (method) {\r\n that[method] = function () {\r\n // pass them through whenever logging is on at all \r\n // and if the console and method exist\r\n if (Trace.traceLevel(module) > Trace.Levels.off) {\r\n if (_con !== undefined && _con[method] !== undefined) {\r\n _con[method].apply(_con, arguments);\r\n }\r\n // else {\r\n // // TODO: What to do if the method doesn't exist?\r\n // }\r\n }\r\n };\r\n } (_passThroughMethods[idx])); //ignore jslint -- for the \"making a function in a loop\" problem\r\n\r\n idx -= 1; // decrement\r\n }\r\n }\r\n function _createLevelMethods(module, that) {\r\n var idx = _levels.length - 1;\r\n while (idx > 0) { // don't create an \"off\" function\r\n\r\n // using a closure to prevent modification of these values before execution\r\n (function (myLevel, myIndex) {\r\n\r\n // create the specific Trace function here\r\n that[myLevel] = function (message, objs) {\r\n /// \r\n /// Trace a message at the specified trace level\r\n /// \r\n /// \r\n /// The first object (usually a message)\r\n /// \r\n /// \r\n /// Additional object(s) to be logged \r\n /// (just keep adding them w/ commas in between)\r\n /// \r\n\r\n // add the module and level first, then the rest\r\n var args = [module, myLevel];\r\n args = args.concat(Array.prototype.slice.call(arguments));\r\n\r\n // add the message to the log and call any callbacks\r\n _saveLogMessage(args);\r\n _executeCallback(args);\r\n\r\n // make sure we can and should output this message\r\n if (_con === undefined ||\r\n Trace.shouldTrace(module, myIndex) === false) {\r\n return;\r\n }\r\n\r\n // try the various methods to log things in order\r\n if (_con.firebug !== undefined) {\r\n _con[myLevel].apply(window, args);\r\n }\r\n else if (_con[myLevel] !== undefined) {\r\n _con[myLevel](args);\r\n }\r\n else {\r\n _con.log(args);\r\n }\r\n };\r\n\r\n } (_levels[idx], idx)); //ignore jslint -- for the \"making a function in a loop\" problem\r\n\r\n idx -= 1; // decrement\r\n }\r\n }\r\n\r\n function coerceTraceLevel(newLevel) {\r\n /// \r\n /// Coerces a valid trace level by converting from string and validating the index \r\n /// within the Trace.Levels collection\r\n /// Throws an Error if the value is invalid\r\n /// \r\n if (newLevel === undefined) {\r\n throw new Error('Level is undefined');\r\n }\r\n if (typeof newLevel === 'string') {\r\n var index = _levels.indexOf(newLevel);\r\n if (index === -1) {\r\n throw new Error(newLevel + ' is not a valid Trace Level');\r\n }\r\n newLevel = index;\r\n }\r\n if (newLevel < Trace.Levels.off || newLevel > Trace.Levels.log) {\r\n throw new Error('Trace level of ' + newLevel + ' is not a valid value');\r\n }\r\n return newLevel;\r\n }\r\n\r\n //#endregion\r\n\r\n} (this));","/*\r\n * Version 1.1\r\n * @author Jonathan Sharp\r\n * This treeview component was originally based upon the Treeview jQuery plugin by Jörn Zaefferer\r\n * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/\n * http://docs.jquery.com/Plugins/Treeview\r\n *\r\n */\r\n(function($) {\r\n\t// This method initializes a tree\r\n\t$.fn.originTreeview = function(settings) {\r\n\t\tsettings = $.extend({\r\n\t\t\tcascadeCheck: true\r\n\t\t}, settings || {});\r\n\t\t\r\n\t\t// Handle tree events via event delegation\r\n\t\t$(this).filter('ul')\r\n\t\t\t.addClass('treeview')\r\n\t\t\t.data('settings', settings)\r\n\t\t\t.bind('click', function(evt) {\r\n\t\t\t\tif ( $(evt.target).hasClass('control') ) {\r\n\t\t\t\t\t$(evt.target).originTreeviewToggle();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.originTreeviewLoad()\r\n\t\t\t.If( settings.cascadeCheck == true )\r\n\t\t\t\t.bind('change', function treeviewChangeHandler(evt) {\r\n\t\t\t\t\tvar checked = $(evt.target).is(':checked');\r\n\t\t\t\t\tlog('change event: ' + evt.target.tagName + ' ' + ( checked ? 'CHECKED' : 'UNCHECKED' ) );\r\n\t\t\t\t\t// Process all of the children\r\n\t\t\t\t\t$(evt.target)\r\n\t\t\t\t\t\t.closest('li')\r\n\t\t\t\t\t\t\t.trigger('treeview' + ( checked ? 'selected' : 'unselected' ), [ $(evt.target).closest('li')[0] ] )\r\n\t\t\t\t\t\t\t.find(':checkbox')\r\n\t\t\t\t\t\t\t\t.not(evt.target)\r\n\t\t\t\t\t\t\t\t.each(function() {\r\n\t\t\t\t\t\t\t\t\tvar status = $(this).is(':checked');\r\n\t\t\t\t\t\t\t\t\tif ( status != checked ) {\r\n\t\t\t\t\t\t\t\t\t\t$(this)[ checked ? 'attr' : 'removeAttr' ]('checked', 'checked')\r\n\t\t\t\t\t\t\t\t\t\t\t.closest('li')\r\n\t\t\t\t\t\t\t\t\t\t\t\t.trigger('treeview' + ( checked ? 'selected' : 'unselected' ), [ $(evt.target).closest('li')[0] ] );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t// Process the parents\r\n\t\t\t\t\t$(evt.target)\r\n\t\t\t\t\t\t.parents('li')\r\n\t\t\t\t\t\t\t.slice(1).each(function() {\r\n\t\t\t\t\t\t\t\tvar _this = this;\r\n\t\t\t\t\t\t\t\tvar checkbox = $(this).find(':checkbox').filter(function() {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn _this === $(this).closest('li')[0];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tvar status = checkbox.is(':checked');\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tif ( !checked ) {\r\n\t\t\t\t\t\t\t\t\t// Only trigger the event if the checkbox is not already checked\r\n\t\t\t\t\t\t\t\t\tif ( status != checked ) {\r\n\t\t\t\t\t\t\t\t\t\tcheckbox.removeAttr('checked');\r\n\t\t\t\t\t\t\t\t\t\t$(this).trigger('treeviewunselected', [ $(evt.target).closest('li')[0] ] );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tvar children = $(this).find(':checkbox').not( checkbox );\r\n\t\t\t\t\t\t\t\t\tvar allChecked = children.filter(':checked').length == children.length;\r\n\t\t\t\t\t\t\t\t\t// Only trigger the event if the current checkbox state is going to change\r\n\t\t\t\t\t\t\t\t\tif ( allChecked != status ) {\r\n\t\t\t\t\t\t\t\t\t\tcheckbox[ allChecked ? 'attr' : 'removeAttr' ]('checked', 'checked');\r\n\t\t\t\t\t\t\t\t\t\t$(this).trigger('treeview' + ( allChecked ? 'selected' : 'unselected' ), [ $(evt.target).closest('li')[0] ] );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t// So IE 6-8 really is a big pain in that change events don't bubble. So here we use a propriatary \r\n\t\t\t\t// 'focusin' event to initialize a behavior on focus\r\n\t\t\t\t.If( $.browser.msie )\r\n\t\t\t\t\t.bind('focusin', function(evt) {\r\n\t\t\t\t\t\tvar target = $(evt.target).filter(':checkbox');\r\n\t\t\t\t\t\tif ( target.data('treeviewchange') !== true ) {\r\n\t\t\t\t\t\t\ttarget.data('treeviewchange', true).bind('click', function() {\r\n\t\t\t\t\t\t\t\ttreeviewChangeHandler({ target: this });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\treturn this;\r\n\t};\r\n\t\r\n\t\r\n\t\r\n\tfunction refreshNode() {\r\n\t\tvar $t = $(this);\r\n\t\tvar expanded = $t.hasClass('expanded');\r\n\t\tif ( !expanded ) {\r\n\t\t\t$t.addClass('collapsed');\r\n\t\t}\r\n\t\tif ( $t.find('> ul,> div.control').length == 1 ) {\r\n\t\t\t$('
').prependTo( $t );\r\n\t\t}\r\n\t}\r\n\t\r\n\tfunction refreshTree() {\r\n\t\t$(this)\r\n\t\t\t.find('> li > ul')\r\n\t\t\t\t.parent()\r\n\t\t\t\t\t.each( refreshNode )\r\n\t\t\t\t.end()\r\n\t\t\t\t.each( refreshTree )\r\n\t\t\t.end()\r\n\t\t\t.find('> li.last')\r\n\t\t\t\t.not(':last-child')\r\n\t\t\t\t\t.removeClass('last lastExpanded lastCollapsed')\r\n\t\t\t\t.end()\r\n\t\t\t.end()\r\n\t\t\t.find('> li:last-child')\r\n\t\t\t\t.addClass('last')\r\n\t\t\t\t.find('> ul')\r\n\t\t\t\t\t.parent()\r\n\t\t\t\t\t\t.filter('.collapsed')\r\n\t\t\t\t\t\t\t.addClass('lastCollapsed')\r\n\t\t\t\t\t\t.end()\r\n\t\t\t\t\t\t.filter('.expanded')\r\n\t\t\t\t\t\t\t.addClass('lastExpanded');\r\n\t}\r\n\t\r\n\t// This method will take LIs in the treeview and set the parents count\r\n\t// The LI passed in should have a correct count set first if it is dynmic\r\n\t$.fn.setParentsSelectedCount = function () {\r\n\t\treturn this.each( function () {\r\n\t\t\tvar $parent = $(this).closest('ul').closest('li');\r\n\t\t\tvar totalCount = 0;\r\n\t\t\t$parent.find('> ul > li').each(function () {\r\n\t\t\t\tvar $li = $(this);\r\n\t\t\t\tvar myCount = 0;\t\t\t\t\t\t\r\n\t\t\t\tif( $li.is('.dynamic') ) { //if its dynamic get the count from the label\r\n\t\t\t\t\tmyCount = parseInt( $li.find('> label > em > span').text(), 10 ) || 0;\r\n\t\t\t\t} else if ( $li.find('> label.inline :checkbox').is(':checked') ) { //otherwise its one if its checked\r\n\t\t\t\t\tmyCount = 1;\r\n\t\t\t\t}\r\n\t\t\t\ttotalCount += myCount;\t\t\t\t\t\t\r\n\t\t\t});\r\n\t\t\t$parent.find('> label > em > span').text(totalCount);\r\n\t\t\t$parent.setParentsSelectedCount();\r\n\t\t});\r\n\t};\r\n\t\r\n\t// This method should be called on the tree or branch to initialize \r\n\t// any elements such as the expand + and -\r\n\t$.fn.originTreeviewRefresh = function() {\r\n\t\t$(this).closest('ul').each( refreshTree );\r\n\t\treturn this;\r\n\t};\r\n\t\r\n\t// Given a UL, will load any child nodes from the url contained in the \r\n\t// data-src=\"\" html attribute, optionally you can specify the url as the \r\n\t// first parameter to load from\r\n\t$.fn.originTreeviewLoad = function(url, triggerEvent) {\r\n\t\tif ( arguments.length == 1 && ( url === true || url === false ) ) {\r\n\t\t\ttriggerEvent = url;\r\n\t\t\turl = undefined;\r\n\t\t}\r\n\t\tthis.filter('ul').each(function() {\r\n\t\t\tvar src = url || $(this).dataset('src');\r\n\t\t\tif ( src ) {\r\n\t\t\t\t$(this).removeDataset('src');\r\n\t\t\t\t$('
  • ').addInlineLoading('Loading...').appendTo( this );\r\n\t\t\t\t\r\n\t\t\t\tvar $li = $(this).closest('li');\r\n\t\t\t\tvar ck = $li.find(':checkbox').is(':checked');\r\n\t\t\t\t\r\n\t\t\t\tvar postData = $(this).dataset('post') || '';\r\n\t\t\t\tpostData += ( postData != '' ? '&' : '' ) + 'checkAll=' + ck;\r\n\t\t\t\t\r\n\t\t\t\tvar _this = this;\r\n\t\t\t\t$.post( src, postData, function(html) {\r\n\t\t\t\t\t// We are the top level tree, so don't replace the UL, just\r\n\t\t\t\t\t// append our children to it\r\n\t\t\t\t\tif ( $(_this).hasClass('treeview') ) {\r\n\t\t\t\t\t\t$(_this).empty();\r\n\t\t\t\t\t\t$(html).find('> li').appendTo( _this ).originTreeviewRefresh();\r\n\t\t\t\t\t\t// Trigger children loaded event\r\n\t\t\t\t\t\t$(_this).trigger('treeViewChildrenLoaded');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$(html).replaceAll( _this ).originTreeviewRefresh();\r\n\t\t\t\t\t\t// Trigger children loaded event\r\n\t\t\t\t\t\t$li.trigger('treeViewChildrenLoaded');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( triggerEvent !== false ) {\r\n\t\t\t\t\t\tvar isExpanded = $li.hasClass('expanded');\r\n\t\t\t\t\t\t$(_this).closest('li').trigger( isExpanded ? 'treeviewcollapsed' : 'treeviewexpanded' );\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 'html' );\r\n\t\t\t} else {\r\n\t\t\t\t$(this).originTreeviewRefresh();\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn this;\r\n\t};\r\n\t\r\n\t// Toggles expanding or collapsing a branch\r\n\t$.fn.originTreeviewToggle = function(force, triggerEvent) {\r\n\t\treturn this.each(function() {\r\n\t\t\tlog('Toggling');\r\n\t\t\tvar $li = $(this).closest('li');\r\n\t\t\tvar isExpanded = $li.hasClass('expanded');\r\n\t\t\t\r\n\t\t\tlog('force: ' + force + ' isExpanded: ' + isExpanded);\r\n\t\t\t\r\n\t\t\tif ( ( force === true && !isExpanded ) || ( force === false && isExpanded ) || !( force === true || force === false ) ) {\r\n\t\t\t\tvar expand = ( force === true || force === false ) ? force : !isExpanded;\r\n\t\t\t\tlog('Expand? ' + expand);\r\n\t\t\t\t$li\t.toggleClass('expanded', expand).toggleClass('collapsed', !expand)\r\n\t\t\t\t\t.filter('.last').toggleClass('lastExpanded', expand).toggleClass('lastCollapsed', !expand);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tvar $ul = $li.find('> ul');\r\n\t\t\tvar src = $ul.dataset('src');\r\n\t\t\tif ( src ) {\r\n\t\t\t\t$ul.originTreeviewLoad( triggerEvent );\r\n\t\t\t} else if ( triggerEvent !== false ) {\r\n\t\t\t\t$li.trigger( isExpanded ? 'treeviewcollapsed' : 'treeviewexpanded' );\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\t\r\n\t// Method walks the tree and opens all parents revealing this child\r\n\t$.fn.originTreeviewRevealNode = function(triggerEvent) {\r\n\t\tthis.filter('li').each(function() {\r\n\t\t\t$(this).parents().each(function() {\r\n\t\t\t\tif ( $(this).is('ul.treeview') ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t} else if ( $(this).is('li') ) {\r\n\t\t\t\t\t$(this).originTreeviewToggle( true, triggerEvent );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\treturn this;\r\n\t};\r\n\t\r\n\t// Inserts one or more nodes at the current point of interaction\r\n\t$.fn.originTreeviewInsert = function(node) {\r\n\t\treturn this.each(function() {\r\n\t\t\tvar $node = $(node);\r\n\t\t\tvar $t = $(this);\r\n\t\t\tif ( $t.is('ul') ) {\r\n\t\t\t\tif ( $node.is('li') ) {\r\n\t\t\t\t\t$node.appendTo( $t );\r\n\t\t\t\t} else if ( $node.is('ul') ) {\r\n\t\t\t\t\t$node.find('> li').appendTo( $t );\r\n\t\t\t\t}\r\n\t\t\t\t$t.originTreeviewRefresh();\r\n\t\t\t} else {\r\n\t\t\t\tvar li = $(this).closest('li');\r\n\t\t\t\tif ( $node.is('li') ) {\r\n\t\t\t\t\t$node.insertAfter( li );\r\n\t\t\t\t} else if ( $node.is('ul') ) {\r\n\t\t\t\t\tvar ul = li.find('> ul');\r\n\t\t\t\t\tif ( ul.length == 1 ) {\r\n\t\t\t\t\t\t$node.find('> li').appendTo( ul );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$node.appendTo( ul );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tli.parent().originTreeviewRefresh();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\t\r\n\t// Removes the specified node in the tree\r\n\t$.fn.originTreeviewRemove = function() {\r\n\t\tvar removed = [];\r\n\t\tthis.each(function() {\r\n\t\t\tvar $li = $(this).closest('li');\r\n\t\t\tvar $parent = $li.parent();\r\n\t\t\t$li.remove();\r\n\t\t\t$.merge( removed, $li.get(0) );\r\n\t\t\t$parent.trigger('treeviewremoved', [ $li.get(0) ] );\r\n\t\t});\r\n\t\treturn this.pushStack( removed );\r\n\t};\r\n})(jQuery);"]}