503.692.3800
Products
Addresses
Price List
Favorite Lists
Call Us Today:
503.692.3800
Sign In
0
Your shopping cart is empty.
View & Edit Cart
Flanges
AWWA Flanges
1/2" Thick Light Weight Flanges
Plate Style Flanges
ANSI-Style Forged Flanges
Exhaust Flanges
DIN (Metric) Flanges
Backing Flanges
Tolerances
Expansion Joints
Rubber Expansion Joints and Accessories
Pump Connectors
Rubber Expansion Joints Installation Guide
Valves
Butterfly, Check Valves and Accessories
Butterfly Valves Installation, Operation, & Maintenance Guide
Fittings & Accessories
KLAMPz Grooved Piping System
Other Fittings & Accessories
Custom Machining
About Us
About Us
Careers
Resource Center
Contact Us
Categories
Categories
Flanges
AWWA C207 & C228 Flanges
1/2 Inch Thick Lightweight Pipe Flanges
Plate-Style Flanges
ANSI-Style Forged Flanges
Exhaust Pipe Flanges
DIN (Metric) Steel and Stainless Steel Flanges
Backing Flanges
Expansion Joints & Pump Connectors
Rubber Expansion Joints & Accessories
Pump Connectors
Valves & Accessories
Fittings & Accessories
KLAMPz Grooved Pipe Fittings
Pipe Fittings & Accessories
OEM Products
WARNING: You will not be able to place an order or use most features of this site with JavaScript disabled
', title: 'Attach Files', size: 'small', backdrop: 'static', footer: '
Done
' }); setTimeout(function() { var modalTemplate = $('#modalTemplate'); ko.applyBindings(entity, modalTemplate[0]); modalTemplate.focus(); }, 10); } } /** * Utility function to load the members that can be added to an activity. * @param {string} entity The name of the entity to load. * @param {string} key The Id of the entity to load. * @callback callback The function to call and pass the loaded data. */ function loadAvailableMembers(entity, key, callback) { callback = callback || function() {}; if(Config && Config.apiBaseUrl && Config.sessionKey && entity && key) { jQuery.ajax({ url: Config.apiBaseUrl + entity + '/' + key + '/availableMembers', cache: true, type: 'GET', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, dataType: 'json', contentType: "application/json", success: function(data,status,request) { callback(data); }, error: function(data) { console.log('Error getting availableMembers'); } }); } } /************************************************************************************************************** * Utility function to view an Activity in the Detail Slide Out. * @param {ActivityViewModel} activityVM The ActivityViewModel to view. It should already be loaded with data. */ function setupActivityToView(activityVM) { viewModels.activity = viewModels.activity || ko.observable(); viewModels.activity(activityVM); viewModels.activity().loadRelatedData(); }; /************************************************************************************************************** * Utility function to view an Activity in the Detail Slide Out. * @param {ActivityViewModel} activityVM The ActivityViewModel to view. It should already be loaded with data. */ function viewActivity(activityVM, onClose) { viewModels.detailSlideOut().templateName(viewModels.detailSlideOut().defaultTemplate); viewModels.detailSlideOut().data({}); viewModels.detailSlideOut().wasUpdated(false); setupActivityToView(activityVM); viewModels.activity().onUpdate = function(){ viewModels.detailSlideOut().wasUpdated(true); }; viewModels.detailSlideOut().data(viewModels.activity); viewModels.detailSlideOut().templateName(viewModels.activity().primaryTemplate); viewModels.detailSlideOut().onClose = onClose|| function() { viewModels.activity().cancelChanges(); }; viewModels.detailSlideOut().open(); }; /************************************************************************************************************** * Utility function to load an Activity from the API with all of its supporting lists. * @param {int} activityId The id of the Activity to view. * @param {function} callback The callback function */ function getActivityWithDetails(activityId, callback) { callback = callback || function() {}; if(Config && Config.apiBaseUrl && Config.sessionKey) { $.ajax({ url: Config.apiBaseUrl + 'activities/' + activityId + '/withDetails', crossDomain: true, method: 'GET', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, contentType: "application/json", success: function(data){ var assignees = _.filter(data.activityAssignees, function(assignee){ return !assignee.username.includes('@cimcloud.com'); }); viewModels.activityTypes(data.activityTypes); viewModels.activityTags(data.activityTags); viewModels.activityWorkQueues(data.workQueues); viewModels.activityPriorities(data.activityPriorities); viewModels.activityLifecycleStages(data.activityLifecycleStages); viewModels.activityCategories(data.activityCategories); viewModels.activityAssignees(assignees.sort(function(a,b) { return a.firstName 0)) return callback(); if(Config && Config.apiBaseUrl && Config.sessionKey) { $.ajax({ url: Config.apiBaseUrl + 'accounts/search', cache: false, type: 'POST', dataType: 'json', contentType: "application/json", headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, data: JSON.stringify({ fields: [ { name: "number" }, { name: "name" } ], sort: [ [ "name", "asc" ] ], filters: [], start: 0, rows: 25, fullTextSearch: { searchPhrase: query, suggestedFields: [ "number", "name" ] } }), error: function() { callback(); }, success: function(res) { callback(res.data); } }); } else { return callback(); } } Utilities.loadAccountUsers = function (accountId, callback) { callback = callback || function() {}; if (accountId && Config && Config.apiBaseUrl && Config.sessionKey) { jQuery.ajax({ url: Config.apiBaseUrl + 'accounts/' + accountId + '/users', cache: true, type: 'GET', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, dataType: 'json', contentType: "application/json", success: function(data,status,request) { viewModels.accountUsers(data); callback(data); }, error: function(data) { console.log('Error getting Activity Account Users'); } }); } } /************************************************************************************************************** * Inbox */ //KO Mapping object. var inboxMapping = { create: function(options) { return new InboxViewModel(options.data); } }; function loadInboxData() { if(Config && Config.apiBaseUrl && Config.sessionKey) { $.ajax({ url: Config.apiBaseUrl + 'activities/inbox', crossDomain: true, method: 'GET', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, contentType: "application/json", success: function(data){ if (viewModels.inbox().selectedActivity) { ko.mapping.fromJS(data, inboxMapping, viewModels.inbox); } else { viewModels.inbox(ko.mapping.fromJS(data, inboxMapping)); } }, error: function(data){ ko.mapping.fromJS({}, inboxMapping, viewModels.inbox); } }); } // auto refresh after 30 seconds. setTimeout(loadInboxData, 30000); } /************************************************************************************************************** * View Model for the Inbox. */ function InboxViewModel(data) { var self = this; self.activities = ko.observableArray([]); self.selectedActivity = ko.observable(); ko.mapping.fromJS(data, { 'activities': activityMapping}, self); self.selectActivity = function(activity) { self.selectedActivity(activity); } self.open = function() { $('html').addClass('drawer-open'); }; self.close = function() { $('html').removeClass('drawer-open'); }; self.headerClick = function() { $('html').toggleClass('drawer-open'); } $(document).on('click', function(e) { if ($(e.target).closest('.drawer').length === 0) { viewModels.inbox().close(); } }); } /************************************************************************************************************** * More utility functions */ function dial(entity, key, description) { return function () { console.log('Dialing...'); var callFrom = $('#callFrom').val(); viewModels.calling(description); if(Config && Config.apiBaseUrl && Config.sessionKey) { $.ajax({ url: Config.apiBaseUrl + entity + '/' + key + '/call', cache: false, type: 'POST', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, contentType: "application/json", data: JSON.stringify({ from: callFrom }), success: function(data,status,request){ setTimeout(function() { $('#modalCalling').modal('hide'); }, 5000) }, error: function(data) { $('#modalCalling').modal('hide'); alert('Could not start call'); } }); } else { $('#modalCalling').modal('hide'); alert('Could not start call'); } } } $(function () { $(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) { var target = $(e.target).attr("href") // activated tab if(Config && Config.apiBaseUrl && Config.contextType && Config.contextKey) { if (target ==='#makeCallTab' && !viewModels.isUsersLoaded()) { if(Config && Config.apiBaseUrl && Config.contextType && Config.contextKey && Config.sessionKey) { $.ajax({ url: Config.apiBaseUrl + Config.contextType + '/' + Config.contextKey + '/users', type: 'GET', headers: { 'Authorization' : 'Bearer ' + Config.sessionKey }, dataType: 'json', contentType: "application/json", success: function(data,status,request){ ko.mapping.fromJS(data, {}, viewModels.users); viewModels.isUsersLoaded(true); }, error: function(data) { } }); } } } }); }); //http://stackoverflow.com/questions/11381673/detecting-a-mobile-browser function isMobile() { var check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; };
×
Activity