PageSourceSearch

https://web.calrest.org/external/WCControls/v12/viewmodels/WC_ViewModelBase.js?v=24.20.1.19281

js calrest.org collected 2026-09-24 19:58:54 UTC 107,012 bytes, 2,873 lines download raw bytes

1
2var WC_ViewModelBase = kendo.Class.extend({
3    CanSave: false,
4    CanNew: false,
5    CanDelete: false,
6
7    //JSON Functions
8    JSONStringToDate: function (value) {
9
10
11
12        //var _ParentObject = this;
13        //return _ParentObject.ParseJSONDate(value);
14
15        //var objParsedDate = kendo.parseDate(value, "yyyy-MM-ddTHH:mm:ss.fffZ");
16        //return objParsedDate;
17
18
19        //var s = value.split(/[-T:Z]/ig);
20        //var objParsedDate = new Date(Date.UTC(s[0], --s[1], s[2], s[3], s[4], s[5]));
21        //return objParsedDate;
22
23        //var s = value.split(/[-T:Z]/ig);
24        //var objParsedDate = new Date(s[0], s[1], s[2], s[3], s[4], s[5], 0);
25        //return objParsedDate;
26
27        var objParsedDate = new Date();
28        // year    month   day     hour    min     sec
29        var recognized_date_pattern = /(\d{4})\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)\D(\d\d)/;
30
31        // a date we recognize. build by hand to go around timezone issue
32        if (value && (typeof value == 'string') && (value.search(recognized_date_pattern) > -1)) {
33            // get the parts of the date and time out of the string
34            var regex_datetime_matches = value.match(recognized_date_pattern);
35            var value_year = regex_datetime_matches[1];
36            var value_month = regex_datetime_matches[2];
37            var value_date = regex_datetime_matches[3];
38            var value_hour = regex_datetime_matches[4];
39            var value_minute = regex_datetime_matches[5];
40            var value_second = regex_datetime_matches[6];
41
42            // shove the date values into the date object, completely bypassing timezone
43            objParsedDate.setFullYear(value_year);
44            objParsedDate.setDate(1); //set date to 1 before setting the month to avoid an issue where the month is wrong on the 31st of a month
45            objParsedDate.setMonth(value_month - 1);
46            objParsedDate.setDate(value_date);
47            objParsedDate.setHours(value_hour);
48            objParsedDate.setMinutes(value_minute);
49            objParsedDate.setSeconds(value_second);
50        }
51        else
52            // don't know what kind of date-time this is; hope JS Date can parse it on it's own
53            objParsedDate = new Date(value);
54
55        return objParsedDate;
56
57
58
59
60    },
61    ParseJSONDate: function (jsonDate) {
62        var _ParentObject = this;
63        // Get the date time part
64        var dateTimePart = jsonDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1');
65
66        // Check for + or - sign
67        var minusSignIndex = dateTimePart.indexOf('-');
68        var plusSignIndex = dateTimePart.indexOf('+');
69
70        // Get the sign index
71        var signIndex = minusSignIndex > 0 ? minusSignIndex : plusSignIndex;
72
73        // If sign index is not 0 then we are extracting offset part and 
74        if (signIndex > 0) {
75            var datePart = dateTimePart.substring(0, signIndex);
76            var offsetPart = dateTimePart.substring(signIndex);
77
78            var offset = offsetPart.substring(0, 3) + '.' + ((parseFloat(offsetPart.substring(3)) / 60) * 100).toString();
79            return _ParentObject.GetJSONDate(parseFloat(datePart), parseFloat(offset));
80        }
81        else {
82            return _ParentObject.GetJSONDate(dateTimePart, 0);
83        };
84    },
85    GetJSONDate: function (ms, offset) {
86        // create Date object for current location
87        var date = new Date(ms);
88
89        // convert to msec
90        // add local time zone offset 
91        // get UTC time in msec
92        var timeZoneOffset = date.getTimezoneOffset();
93        var utcTime = date.getTime() + (timeZoneOffset * 60000);
94
95        // create new Date object for different city
96        // using supplied offset
97        var jsDate = new Date(utcTime + (3600000 * offset));
98        return jsDate;
99    },
100    ConvertAllObjectJSONDatePropertiesToDate: function (Object) {
101        var _ParentObject = this;
102
103        for (var prop in Object) {
104            if (_ParentObject.Contains(prop, "EndDate") == true) {
105                var foo = "";
106            };
107            if (_ParentObject.IsJSONDateString(Object[prop]) == true) {
108
109                var objOrigVal = Object[prop];
110                try {
111                    Object[prop] = _ParentObject.JSONStringToDate(Object[prop]);
112                }
113                catch (ex) {
114                    //conversion didn't work revert to orignal prop value
115                    Object[prop] = objOrigVal;
116                };
117
118            };
119
120
121        };
122
123    },
124    ConvertAllObjectJSONDatePropertiesToCurrentDate: function (Object) {
125        var _ParentObject = this;
126
127        for (var prop in Object) {
128
129            if (_ParentObject.IsJSONDateString(Object[prop]) == true) {
130                Object[prop] = _ParentObject.GetCurrentDateWithNoTime();
131            };
132
133        };
134
135    },
136    ConvertAllArrayJSONDatePropertiesToDate: function (Array) {
137        var _ParentObject = this;
138        wc$.each(Array, function (index, value) {
139            var SourceObject = Array[index];
140            _ParentObject.ConvertAllObjectJSONDatePropertiesToDate(SourceObject);
141        });
142    },
143
144   
145    GetLocalGMTOffSet: function () {
146
147        var dateTimePart = new Date().toString();
148        var minusSignIndex = dateTimePart.indexOf('-');
149        var plusSignIndex = dateTimePart.indexOf('+');
150
151        // Get the sign index
152        var signIndex = minusSignIndex > 0 ? minusSignIndex : plusSignIndex;
153
154        var offsetPart = dateTimePart.substring(signIndex);
155
156        var offset = offsetPart.substring(0, 3) + '.' + ((parseFloat(offsetPart.substring(3)) / 60) * 100).toString();
157        offset = parseFloat(offset);
158        return offset;
159    },
160    TimeZones: [
161	{ GMTOffset: 5.0, Descr: ' (GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent', ShortDescr: '' },
162	{ GMTOffset: 4.5, Descr: ' (GMT +4:30) Kabul', ShortDescr: '' },
163	{ GMTOffset: 4.0, Descr: ' (GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi', ShortDescr: '' },
164	{ GMTOffset: 3.5, Descr: ' (GMT +3:30) Tehran', ShortDescr: '' },
165	{ GMTOffset: 3.0, Descr: ' (GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg', ShortDescr: '' },
166	{ GMTOffset: 2.0, Descr: ' (GMT +2:00) Kaliningrad, South Africa', ShortDescr: '' },
167	{ GMTOffset: 1.0, Descr: ' (GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris', ShortDescr: '' },
168	{ GMTOffset: -12.0, Descr: ' (GMT -12:00) Eniwetok, Kwajalein', ShortDescr: '' },
169	{ GMTOffset: -11.0, Descr: ' (GMT -11:00) Midway Island, Samoa', ShortDescr: '' },
170	{ GMTOffset: -10.0, Descr: ' (GMT -10:00) Hawaii', ShortDescr: 'HST' },
171	{ GMTOffset: -9.0, Descr: ' (GMT -9:00) Alaska', ShortDescr: 'AKST' },
172	{ GMTOffset: -8.0, Descr: ' (GMT -8:00) Pacific Time (US & Canada)', ShortDescr: 'PST' },
173	{ GMTOffset: -7.0, Descr: ' (GMT -7:00) Mountain Time (US & Canada)', ShortDescr: 'MST' },
174	{ GMTOffset: -6.0, Descr: ' (GMT -6:00) Central Time (US & Canada), Mexico City', ShortDescr: 'CST' },
175	{ GMTOffset: -5.0, Descr: ' (GMT -5:00) Eastern Time (US & Canada), Bogota, Lima', ShortDescr: 'EST' },
176	{ GMTOffset: -4.5, Descr: ' (GMT -4:30) Caracas', ShortDescr: '' },
177	{ GMTOffset: -4.0, Descr: ' (GMT -4:00) Atlantic Time (Canada), La Paz', ShortDescr: 'EDT' },
178	{ GMTOffset: -3.5, Descr: ' (GMT -3:30) Newfoundland', ShortDescr: '' },
179	{ GMTOffset: -3.0, Descr: ' (GMT -3:00) Brazil, Buenos Aires, Georgetown', ShortDescr: '' },
180	{ GMTOffset: -2.0, Descr: ' (GMT -2:00) Mid-Atlantic', ShortDescr: '' },
181	{ GMTOffset: -1.0, Descr: ' (GMT -1:00 hour) Azores, Cape Verde Islands', ShortDescr: '' },
182	{ GMTOffset: 0.0, Descr: ' (GMT) Western Europe Time, London, Lisbon, Casablanca', ShortDescr: 'GMT' },
183	{ GMTOffset: 5.5, Descr: ' (GMT +5:30) Bombay, Calcutta, Madras, New Delhi', ShortDescr: '' },
184	{ GMTOffset: 5.75, Descr: ' (GMT +5:45) Kathmandu', ShortDescr: '' },
185	{ GMTOffset: 6.0, Descr: ' (GMT +6:00) Almaty, Dhaka, Colombo', ShortDescr: '' },
186	{ GMTOffset: 7.0, Descr: ' (GMT +7:00) Bangkok, Hanoi, Jakarta', ShortDescr: '' },
187	{ GMTOffset: 8.0, Descr: ' (GMT +8:00) Beijing, Perth, Singapore, Hong Kong', ShortDescr: '' },
188	{ GMTOffset: 9.0, Descr: ' (GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk', ShortDescr: '' },
189	{ GMTOffset: 9.5, Descr: ' (GMT +9:30) Adelaide, Darwin', ShortDescr: '' },
190	{ GMTOffset: 10.0, Descr: ' (GMT +10:00) Eastern Australia, Guam, Vladivostok', ShortDescr: '' },
191	{ GMTOffset: 11.0, Descr: ' (GMT +11:00) Magadan, Solomon Islands, New Caledonia', ShortDescr: '' },
192	{ GMTOffset: 12.0, Descr: ' (GMT +12:00) Auckland, Wellington, Fiji, Kamchatka', ShortDescr: '' },
193    ],
194    GetLocalTimeZoneDisplay: function () {
195        var _ParentObject = this;
196        var strDisplay = "";
197        var intLocalOffset = _ParentObject.GetLocalGMTOffSet();
198        wc$.each(_ParentObject.TimeZones, function (iTZIndex, iTZValue) {
199
200            if (iTZValue.GMTOffset == intLocalOffset) {
201
202                if (iTZValue.ShortDescr != "") {
203                    strDisplay = iTZValue.ShortDescr;
204                }
205                else {
206                    strDisplay = iTZValue.Descr;
207                };
208                
209                return false; //break
210            };
211        });
212
213        return strDisplay;
214    },
215    IsJSONDateString: function (value) {
216        var _ParentObject = this;
217        var bolResult = false;
218
219
220        if (_ParentObject.IsJSONUTCDateString(value) == true || _ParentObject.IsJSONMicrosoftDateString(value) == true) {
221            bolResult = true;
222        };
223
224        return bolResult;
225    },
226    IsJSONUTCDateString: function (value) {
227        var _ParentObject = this;
228        var bolResult = false;
229        try {
230            if (value.match(/\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}(:\d{1,2})?Z?/i))
231                bolResult = true;
232        }
233        catch (ex) {
234            //ignore not a date
235        };
236
237        return bolResult;
238    },
239    IsJSONMicrosoftDateString: function (value) {
240        var _ParentObject = this;
241        var bolResult = false;
242        try {
243            if (_ParentObject.Startswith(value, "/Date")) {
244
245                bolResult = true;
246            };
247        }
248        catch (ex) {
249            //ignore not a date
250        };
251
252        return bolResult;
253    },
254
255
256    AFT: "",
257    SecureWebRoot: "",
258    //Gateway Functions
259    GetGatewayURL: function () {
260        var _ParentObject = this;
261        var strGatewayURL = "";
262        if (_ParentObject.AFT != undefined && _ParentObject.AFT != "") {
263            strGatewayURL = '/external/wcpages/v12/gateway/gateway.aspx?FriendlyResponse=true&AFT=' + _ParentObject.AFT;
264        }
265        else {
266            strGatewayURL = '/external/wcpages/v12/gateway/gateway.aspx?FriendlyResponse=true';
267        };
268        if (_ParentObject.HasQueryStringParameter("token") == true) {
269            var strCurrentURL = window.location.href;
270            var strToken = _ParentObject.GetQueryStringParameter("token", "string");
271            if (strToken != "") {
272                strGatewayURL = strGatewayURL + "&token=" + strToken;
273            };
274
275        };
276
277        return strGatewayURL;
278    },
279    GetGatewayResponse: function (gatewaydata, defaultvalue) {
280        var _ParentObject = this;
281        var _Result = defaultvalue;
282        var strData = JSON.stringify(gatewaydata);
283        var strURL = _ParentObject.GetGatewayURL();
284        wc$.ajax(
285           {
286               type: "POST",
287               async: false, //this will force the UI to not execute other js calls before the data is loaded
288               cache: false,
289               url: strURL,
290               data: strData,
291               contentType: "application/json; charset=utf-8",
292               dataType: "json",
293               success: function (response) {
294
295                   if (response.HasError == true) {
296                       alert(response.Message);
297                   }
298                   else {
299                       if (response.Response != undefined) {
300                           if (response.Response != null) {
301                               if (response.Response != "") {
302                                   _Result = JSON.parse(response.Response);
303                               };
304                           };
305                       };
306
307
308                   };
309
310
311               },
312               error: function (xhr, textStatus, errorThrown) {
313                   alert(errorThrown);
314               }
315           });
316
317        return _Result;
318    },
319    GetGatewayResponseASYNC: function (gatewaydata, Object, PropertyName, ResponseCompleteBooleanPropertyName, ResponseInProgressBooleanPropertyName, PopulatedPropertyHasValuesTruePropertyName, PopulatedPropertyHasValuesFalsePropertyName, ResponseReturnedObject, PopulatedPropertyHasValuesObject) {
320        var _ParentObject = this;
321        var strData = JSON.stringify(gatewaydata);
322        var strGatewayURL = _ParentObject.GetGatewayURL();
323        wc$.ajax(
324        {
325            type: "POST",
326            async: true,
327            cache: false,
328            url: strGatewayURL,
329            data: strData,
330            contentType: "application/json; charset=utf-8",
331            dataType: "json",
332            success: function (response) {
333
334                if (response.HasError == true) {
335                    alert(response.Message);
336
337                }
338                else {
339
340                    var objData
341
342                    if (response.Response != undefined && response.Response != "") {
343                        objData = JSON.parse(response.Response);
344                    };
345
346                    if (Object != undefined) {
347                        _ParentObject.SetObjectPropertyValue(Object, PropertyName, objData);
348                    };
349
350
351
352                    //if necessary set any indicators that the response has returned
353                    if (ResponseCompleteBooleanPropertyName != undefined) {
354                        if (ResponseReturnedObject != undefined) {
355                            _ParentObject.SetObjectPropertyValue(ResponseReturnedObject, ResponseCompleteBooleanPropertyName, true);
356                        }
357                        else {
358                            _ParentObject.SetObjectPropertyValue(Object, ResponseCompleteBooleanPropertyName, true);
359                        };
360
361                    };
362                    if (ResponseInProgressBooleanPropertyName != undefined) {
363                        if (ResponseReturnedObject != undefined) {
364                            _ParentObject.SetObjectPropertyValue(ResponseReturnedObject, ResponseInProgressBooleanPropertyName, false);
365                        }
366                        else {
367                            _ParentObject.SetObjectPropertyValue(Object, ResponseInProgressBooleanPropertyName, false);
368                        };
369
370                    };
371
372                    //if necessary set any indicators that the populated property has values or not - for arrays
373                    //Has Values Property Setting
374                    if (PopulatedPropertyHasValuesTruePropertyName != undefined) {
375                        if (PopulatedPropertyHasValuesObject != undefined) {
376                            if (_ParentObject.GetObjectPropertyValue(Object, PropertyName).length > 0) {
377                                _ParentObject.SetObjectPropertyValue(PopulatedPropertyHasValuesObject, PopulatedPropertyHasValuesTruePropertyName, true);
378                            }
379                            else {
380                                _ParentObject.SetObjectPropertyValue(PopulatedPropertyHasValuesObject, PopulatedPropertyHasValuesTruePropertyName, false);
381                            };
382
383                        }
384                        else {
385
386                            if (_ParentObject.GetObjectPropertyValue(Object, PropertyName).length > 0) {
387                                _ParentObject.SetObjectPropertyValue(Object, PopulatedPropertyHasValuesTruePropertyName, true);
388                            }
389                            else {
390                                _ParentObject.SetObjectPropertyValue(Object, PopulatedPropertyHasValuesTruePropertyName, false);
391                            };
392
393                        };
394
395                    };
396
397
398                    //No Value Property Setting
399                    if (PopulatedPropertyHasValuesFalsePropertyName != undefined) {
400
401
402                        if (PopulatedPropertyHasValuesObject != undefined) {
403                            if (_ParentObject.GetObjectPropertyValue(Object, PropertyName).length > 0) {
404                                _ParentObject.SetObjectPropertyValue(PopulatedPropertyHasValuesObject, PopulatedPropertyHasValuesFalsePropertyName, false);
405                            }
406                            else {
407                                _ParentObject.SetObjectPropertyValue(PopulatedPropertyHasValuesObject, PopulatedPropertyHasValuesFalsePropertyName, true);
408                            };
409
410                        }
411                        else {
412
413                            if (_ParentObject.GetObjectPropertyValue(Object, PropertyName).length > 0) {
414                                _ParentObject.SetObjectPropertyValue(Object, PopulatedPropertyHasValuesFalsePropertyName, false);
415                            }
416                            else {
417                                _ParentObject.SetObjectPropertyValue(Object, PopulatedPropertyHasValuesFalsePropertyName, true);
418                            };
419
420                        };
421
422                    };
423
424
425                }
426
427
428            },
429            error: function (xhr, textStatus, errorThrown) { alert(errorThrown); }
430        });
431    },
432    GetGatewayResponseASYNCWithSuccessFunction: function (gatewaydata, successfunctionwithresponseparam) {
433        var _ParentObject = this;
434
435        wc$.ajax(
436        {
437            type: "POST",
438            async: true,
439            cache: false,
440            url: _ParentObject.GetGatewayURL(),
441            data: JSON.stringify(gatewaydata),
442            contentType: "application/json; charset=utf-8",
443            dataType: "json",
444            context: _ParentObject, //sets the this var to the parent object in the success callback
445            success: successfunctionwithresponseparam,
446            error: function (xhr, textStatus, errorThrown) { alert(errorThrown); }
447        });
448    },
449
450    //URL Functions
451    GetQueryStringParameter: function (ParamName, expectedtype) {
452        var query = window.location.search.substring(1);
453
454        var parms = query.split('&');
455        var result = '';
456
457        for (var i = 0; i < parms.length; i++) {
458            var pos = parms[i].indexOf('=');
459
460            if (pos > 0) {
461                var key = parms[i].substring(0, pos);
462                if (ParamName.toLowerCase() == key.toLowerCase()) {
463                    var val = parms[i].substring(pos + 1);
464                    result = decodeURIComponent(val);
465                }
466            }
467
468        }
469
470        if (expectedtype.toLowerCase() == 'boolean') {
471            if (result.toLowerCase() == 'true') {
472                result = true;
473            }
474            else {
475                result = false;
476            }
477        }
478
479        if (expectedtype.toLowerCase() == 'number') {
480            if (result == '') {
481                result = 0;
482            }
483            else {
484                result = parseFloat(result);
485            }
486        }
487
488        if (expectedtype.toLowerCase() == 'date') {
489            if (result == '') {
490                result = new Date();
491            }
492            else {
493                result = Date.parse(result);
494            }
495        }
496
497        return result;
498    },
499    HasQueryStringParameter: function (ParamName) {
500        var query = window.location.search.substring(1);
501
502        var parms = query.split('&');
503        var result = false;
504
505        for (var i = 0; i < parms.length; i++) {
506            var pos = parms[i].indexOf('=');
507
508            if (pos > 0) {
509                var key = parms[i].substring(0, pos);
510                if (ParamName.toString().toLowerCase() == key.toString().toLowerCase()) {
511                    result = true;
512                }
513            }
514
515        }
516        return result;
517    },
518    GetFeatureUpcomingAction: function () {
519        alert('Feature Upcoming'); return false;
520    },
521    GetFeatureUpcomingActionNewWindow: function () {
522
523        var objWindow = window.open("", "newwin", "height=400, width=400,toolbar=no,scrollbars=" + scroll + ",menubar=no");
524        objWindow.document.write("<html>");
525        objWindow.document.write("<title>Upcoming Feature</title>");
526        objWindow.document.write("<body>");
527        objWindow.document.write("<br />");
528        objWindow.document.write("<br />");
529        objWindow.document.write("<br />");
530        objWindow.document.write("<br />");
531        objWindow.document.write("<br />");
532        objWindow.document.write("<br />");
533        objWindow.document.write("<h1 style='align:middle'>Feature Upcoming</h1>");
534        objWindow.document.write("<br />");
535        objWindow.document.write("<br />");
536        objWindow.document.wr
536ite("<br />");
537        objWindow.document.write("<br />");
538        objWindow.document.write("<br />");
539        objWindow.document.write("<br />");
540        objWindow.document.write("</body>");
541        objWindow.document.write("</html>");
542
543        objWindow.document.close();
544        //self.name = "main"
545
546    },
547    GetFeatureNotAvailableOnWebURL: function (FeatureName) {
548        var strURL = mobj_ViewModel.GetWCURL("/external/wcpages/v12/webclient/WebClientFeatureNotAvailable.aspx?Feature=" + FeatureName);
549        return strURL;
550    },
551    GetUrlParts: function (url) {
552        var a = document.createElement('a');
553        a.href = url;
554
555        return {
556            href: a.href,
557            host: a.host,
558            hostname: a.hostname,
559            port: a.port,
560            pathname: a.pathname,
561            protocol: a.protocol,
562            hash: a.hash,
563            search: a.search
564        };
565    },
566    GetWCURL: function (url) {
567        var strURL = url;
568        //TODO check for /cwt if needed
569        return strURL;
570    },
571
572
573    //Window Functions
574    OpenNewWindow: function (url, title) {
575        var _ParentObject = this;
576
577        if (title == undefined) {
578            title = "_blank";
579        };
580        var objNewWin = window.open(url, title);
581        if (objNewWin && objNewWin.top) {
582            // popup has opened do nothing else
583        } else {
584            // popup has been blocked notify the user
585            if (_ParentObject.IsBrowserEmbeddedInSmartClient == false) {
586                alert("You browser has blocked " + url + " from opening.  Please add this url to your trusted sites.");
587            };
588
589        }
590
591
592    },
593
594    //Cookie Functions
595    GetCookieValue: function (name, expectedtype) {
596        var _ParentObject = this;
597
598        var result = '';
599        var nameEQ = name + "=";
600        var ca = document.cookie.split(';');
601        for (var i = 0; i < ca.length; i++) {
602            var c = ca[i];
603            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
604            if (c.indexOf(nameEQ) == 0) {
605                result = c.substring(nameEQ.length, c.length);
606                break;
607            };
608        };
609
610        if (expectedtype.toLowerCase() == 'boolean') {
611            if (result.toLowerCase() == 'true') {
612                result = true;
613            }
614            else {
615                result = false;
616            }
617        };
618
619        if (expectedtype.toLowerCase() == 'number') {
620            if (result == '') {
621                result = 0;
622            }
623            else {
624                result = parseFloat(result);
625            }
626        };
627
628        if (expectedtype.toLowerCase() == 'date') {
629            if (result == '') {
630                result = new Date();
631            }
632            else {
633                result = Date.parse(result);
634            }
635        };
636
637        return result;
638    },
639
640    SetCookie: function setCookie(cookiename, value, expiredays) {
641        var exdate = new Date();
642        exdate.setDate(exdate.getDate() + expiredays);
643        var c_value = escape(value) + ((expiredays == null) ? "" : "; expires=" + exdate.toUTCString()) + "; path=/";
644        document.cookie = cookiename + "=" + c_value;
645    },
646    //Object Functions
647    CloneObject: function (sourceobject) {
648        var obj;
649        obj = JSON.parse(JSON.stringify(sourceobject));
650
651        return obj;
652    },
653    CopyObjectPropertyValues: function (SourceObject, DestinationObject) {
654        var _ParentObject = this;
655
656        for (var prop in SourceObject) {
657            if (SourceObject.hasOwnProperty(prop) == true) {
658
659                if (prop != "_events" && prop != "uid" && prop != "parent") {
660                    if (DestinationObject[prop] != null && DestinationObject[prop] != undefined) {
661                        _ParentObject.SetObjectPropertyValue(DestinationObject, prop, SourceObject[prop]);
662                    };
663                };
664
665            };
666
667
668        };
669    },
670    GetObjectDefaultValue: function (expectedtype) {
671        var _defaultvalue = '';
672
673        if (expectedtype.toLowerCase() == 'boolean') {
674            _defaultvalue = false;
675        };
676
677        if (expectedtype.toLowerCase() == 'number') {
678            _defaultvalue = 0;
679        };
680
681        if (expectedtype.toLowerCase() == 'date') {
682            _defaultvalue = new Date();
683        };
684
685        return _defaultvalue;
686    },
687    SetObjectPropertyValue: function (Object, Property, Value) {
688
689        if (Object.set == undefined) {
690            Object[Property] = Value;
691        }
692        else {
693            Object.set(Property, Value);
694        };
695    },
696    SetObjectPropertyValueIfDifferent: function (Object, Property, Value) {
697        var _ParentObject = this;
698        if (_ParentObject.GetObjectPropertyValue(Object, Property) != Value) {
699            _ParentObject.SetObjectPropertyValue(Object, Property, Value);
700        };
701    },
702    GetObjectPropertyValue: function (Object, Property) {
703
704        if (Object.get == undefined) {
705            return Object[Property];
706        }
707        else {
708            return Object.get(Property);
709        };
710    },
711    GetObjectPropertyValueOrDefault: function (Object, Property, ExpectedType) {
712        var _ParentObject = this;
713        var _ObjectValue = undefined;
714        if (Object != undefined) {
715            if (Object.get == undefined) {
716                _ObjectValue = Object[Property];
717            }
718            else {
719                _ObjectValue = Object.get(Property);
720            };
721        };
722
723        if (_ObjectValue == null) {
724            _ObjectValue = _ParentObject.GetObjectDefaultValue(ExpectedType);
725        };
726        if (_ObjectValue == undefined) {
727            _ObjectValue = _ParentObject.GetObjectDefaultValue(ExpectedType);
728        };
729
730        return _ObjectValue;
731    },
732    GetObjectOwnedPropertyNames: function (obj) {
733
734        var keys = [];
735        if (typeof Object.getOwnPropertyNames !== "function") {
736            //for ie 8 support
737           
738
739            // Only iterate the keys if we were given an object, and
740            // a special check for null, as typeof null == "object"
741            if (typeof obj === "object" && obj !== null) {
742                // Use a standard for in loop
743                for (var x in obj) {
744                    // A for in will iterate over members on the prototype
745                    // chain as well, but Object.getOwnPropertyNames returns
746                    // only those directly on the object, so use hasOwnProperty.
747                    if (obj.hasOwnProperty(x)) {
748                        keys.push(x);
749                    }
750                }
751            }
752
753            return keys;
754
755        }
756        else {
757
758            var aryKeys = Object.getOwnPropertyNames(obj);
759            wc$.each(aryKeys, function (intKeyIndex) {
760
761                if (aryKeys[intKeyIndex] != "_events") {
762
763                    keys.push(aryKeys[intKeyIndex]);
764                }
765            });
766            return keys;
767        }
768    },
769    IsNotNullOrUndefined: function (Object) {
770        var bol = false;
771        if (Object != undefined) {
772            if (Object != null) {
773                bol = true;
774            };
775        };
776
777        return bol;
778    },
779    IsNullOrUndefined: function (Object) {
780        var bol = false;
781        if (Object == undefined) {
782            bol = true;
783        }
784        else {
785            if (Object == null) {
786                bol = true;
787            };
788
789        };
790
791        return bol;
792    },
793
794    //Object Collection State Change Tracking
795    TrackObjectCollectionStateChanges: function (ObservableObject) {
796
797        var _ParentObject = this;
798        if (ObservableObject == undefined) {
799            //set it to the entire ViewModel
800            ObservableObject = _ParentObject
801        };
802
803        ObservableObject.bind("change", function (e) {
804            //Added = 0
805            //Modified = 1
806            //Removed = 2
807            //Hidden = 3
808            //Unchanged = 4
809            if (e.items != undefined) {
810                if (e.items.length > 0) {
811                    wc$.each(e.items, function (indexChangeTracking) {
812                        var objChangeTrackingObject = e.items[indexChangeTracking];
813                        var intChangeTrackingValue = 1;
814
815                        if (e.action.toLowerCase() == "add") {
816                            intChangeTrackingValue = 0;
817                        };
818                        if (e.action.toLowerCase() == "itemchange") {
819                            intChangeTrackingValue = 1;
820                        };
821                        if (e.action.toLowerCase() == "remove") {
822                            intChangeTrackingValue = 2;
823                        };
824                        
825                        //do not use set here as it will degrade performance
826                        objChangeTrackingObject.ObjectCollectionState = intChangeTrackingValue;
827
828
829                    });
830
831                };
832            };
833
834        });
835    },
836
837    //Object Collection State Change Tracking Reset
838    ResetObjectCollectionStateChangeTracking: function (array) {
839        wc$.each(array, function (i) {
840            var objChangeTrackingObject = array[i];
841            
842            objChangeTrackingObject.ObjectCollectionState = 4;
843        });
844    },
845    GetObjectCollectionTrackingChanges: function (array) {
846        var aryChangedItems = [];
847        var _ParentObject = this;
848        //Added = 0
849        //Modified = 1
850        //Removed = 2
851        //Hidden = 3
852        //Unchanged = 4
853        aryChangedItems = _ParentObject.GetAllObjectsInArrayWithPropertyValues(array, "ObjectCollectionState", [0, 1, 2]);
854        return aryChangedItems;
855    },
856
857    //Array Functions
858    DynamicSort: function (propertyname) {
859        return function (a, b) {
860            return (a[propertyname] < b[propertyname]) ? -1 : (a[propertyname] > b[propertyname]) ? 1 : 0;
861        };
862    },
863    SetArrayItemPositionPropertyValuesIfNecessary: function (array, propertyname) {
864        var _ParentObject = this;
865
866        //Ensure there is a display order other than 0
867        var intNextUnassignedPosition = _ParentObject.GetMaxArrayItemNumberValueOrOneWhicheverIsGreater(array, propertyname);
868
869        for (var i = 0; i < array.length; i++) {
870            var objItem = array[i];
871            var intItemValue = objItem[propertyname];
872            if (intItemValue == 0) {
873                objItem[propertyname] = _ParentObject.GetMaxArrayItemNumberValueOrOneWhicheverIsGreater(array, propertyname) + 1;
874
875            }
876            else {
877                var aryItemsUpToTheCurrentPoint = array.slice(0, i);
878
879                if (_ParentObject.GetAllObjectsInArrayWithPropertyValue(aryItemsUpToTheCurrentPoint, propertyname, intItemValue).length > 0) {
880
881                    objItem[propertyname] = _ParentObject.GetMaxArrayItemNumberValueOrOneWhicheverIsGreater(array, propertyname) + 1;
882                };
883            };
884
885
886        };
887    },
888    DecrementArrayItemPostionProperty: function (array, propertyname, currentvalue) {
889        var _ParentObject = this;
890
891        var intNewValue = currentvalue - 1;
892        var intLastArrayIndex = array.length - 1;
893
894        var intMinValue = 1;
895        var intMaxValue = 0; //array[intLastArrayIndex].get(propertyname);
896        for (var i = 0; i < array.length; i++) {
897            if (array[i].get(propertyname) > intMaxValue) {
898                intMaxValue = array[i].get(propertyname);
899            }
900        }
901
902        if (intMaxValue < intLastArrayIndex + 1) {
903            intMaxValue = intLastArrayIndex + 1;
904        }
905
906        for (var i = 0; i < array.length; i++) {
907
908            var objItem = array[i];
909            var currentItemvalue = _ParentObject.GetObjectPropertyValue(objItem, propertyname);
910
911            if (_ParentObject.IsNumeric(currentItemvalue) == false) {
912                currentItemvalue = 0;
913            }
914            else {
915                currentItemvalue = parseFloat(currentItemvalue);
916
917            };
918
919            if (currentItemvalue == currentvalue) {
920                //decrement it 1 
921                currentItemvalue = currentItemvalue - 1;
922            }
923            else {
924                if (currentItemvalue == intNewValue) {
925                    //increment it 1 more
926                    currentItemvalue = currentItemvalue + 1;
927                }
928            }
929
930            //don't allow the value to be higher or lower than the min and max values
931            if (currentItemvalue <= intMinValue) {
932                currentItemvalue = intMinValue;
933            }
934
935            if (currentItemvalue >= intMaxValue) {
936                currentItemvalue = intMaxValue;
937            }
938
939            objItem.set(propertyname, currentItemvalue);
940
941        }
942        //now set the value of the one you want
943        //this is the item we want to move
944        //array[currentposition].set(propertyname, intNewDisplayOrder);
945    },
946    IncrementArrayItemPostionProperty: function (array, propertyname, currentvalue) {
947        var _ParentObject = this;
948
949        var intNewValue = currentvalue + 1;
950        var intLastArrayIndex = array.length - 1;
951
952        var intMinValue = 1;
953        var intMaxValue = 0; //array[intLastArrayIndex].get(propertyname);
954        for (var i = 0; i < array.length; i++) {
955            if (array[i].get(propertyname) > intMaxValue) {
956                intMaxValue = _ParentObject.GetObjectPropertyValue(array[i], propertyname);
957            };
958        };
959
960        if (intMaxValue < intLastArrayIndex + 1) {
961            intMaxValue = intLastArrayIndex + 1;
962        };
963
964        for (var i = 0; i < array.length; i++) {
965            var objItem = array[i];
966            var currentItemvalue = _ParentObject.GetObjectPropertyValue(objItem, propertyname);
967            if (_ParentObject.IsNumeric(currentItemvalue) == false) {
968                currentItemvalue = 0;
969            }
970            else {
971                currentItemvalue = parseFloat(currentItemvalue);
972
973            };
974
975            if (currentItemvalue == currentvalue) {
976                //increment it 1 
977                currentItemvalue = currentItemvalue + 1;
978            }
979            else {
980                if (currentItemvalue == intNewValue) {
981                    //decrement it 1 
982                    currentItemvalue = currentItemvalue - 1;
983                };
984            };
985
986            //don't allow the value to be higher or lower than the min and max values
987            if (currentItemvalue <= intMinValue) {
988                currentItemvalue = intMinValue;
989            };
990
991            if (currentItemvalue >= intMaxValue) {
992                currentItemvalue = intMaxValue;
993            };
994
995            objItem.set(propertyname, currentItemvalue);
996        };
997        //now set the value of the one you want
998        //this is the item we want to move
999        //array[currentposition].set(propertyname, intNewDisplayOrder);
1000    },
1001    GetArrayIndexForPropertyValue: function (array, propertyname, value) {
1002        var intReturn = -1;
1003        for (var i = 0; i < array.length; i++) {
1004
1005            var objItem = array[i];
1006            if (objItem[propertyname] == value) {
1007                intReturn = i;
1008            }
1009        }
1010
1011        return intReturn;
1012    },
1013    GetArrayIndexForValue: function (array, value) {
1014        var intReturn = -1;
1015        for (var i = 0; i < array.length; i++) {
1016
1017            var objItem = array[i];
1018            if (objItem == value) {
1019                intReturn = i;
1020            }
1021        }
1022
1023        return intReturn;
1024    },
1025    GetObjectInArrayFromPropertyValue: function (array, propertyname, value) {
1026        var objReturn = undefined;
1027        for (var intArrayIndex = 0; intArrayIndex < array.length; intArrayIndex++) {
1028
1029            var objItem = array[intArrayIndex];
1030            if (objItem[propertyname] == value) {
1031                objReturn = objItem;
1032                break;
1033            };
1034        };
1035
1036        return objReturn;
1037    },
1038    GetAllObjectsInArrayWithPropertyValue: function (array, propertyname, value) {
1039        var objReturn = [];
1040        for (var intArrayIndex = 0; intArrayIndex < array.length; intArrayIndex++) {
1041
1042            var objItem = array[intArrayIndex];
1043            if (objItem[propertyname] != undefined) {
1044
1045                if (objItem[propertyname] == value) {
1046                    objReturn.push(objItem);
1047                };
1048
1049            };
1050
1051
1052        };
1053
1054        return objReturn;
1055    },
1056    GetAllObjectsInArrayWithPropertyValues: function (array, propertyname, values) {
1057        var objReturn = [];
1058        for (var intArrayIndex = 0; intArrayIndex < array.length; intArrayIndex++) {
1059
1060            var objItem = array[intArrayIndex];
1061            for (var intArrayIndexValues = 0; intArrayIndexValues < values.length; intArrayIndexValues++) {
1062
1063                if (objItem[propertyname] != undefined) {
1064
1065                    if (objItem[propertyname] == values[intArrayIndexValues]) {
1066                        objReturn.push(objItem);
1067                    };
1068
1069                };
1070
1071
1072            };
1073
1074        };
1075
1076        return objReturn;
1077    },
1078    HasObjectInArrayForPropertyValue: function (array, propertyname, value) {
1079        var _ParentObject = this;
1080        var bolObjectExists = false;
1081        var objReturnObject = _ParentObject.GetObjectInArrayFromPropertyValue(array, propertyname, value);
1082        if (objReturnObject != undefined) {
1083            bolObjectExists = true;
1084        };
1085
1086        return bolObjectExists;
1087    },
1088    GetMaxArrayItemNumberValueOrOneWhicheverIsGreater: function (array, propertyname) {
1089        var _ParentObject = this;
1090        var intReturn = 1;
1091        for (var i = 0; i < array.length; i++) {
1092
1093            var objItem = array[i];
1094            if (objItem[propertyname] != undefined) {
1095                if (_ParentObject.IsNumeric(objItem[propertyname].toString()) == true) {
1096                    if (parseFloat(objItem[propertyname]) > intReturn) {
1097                        intReturn = parseFloat(objItem[propertyname]);
1098                    };
1099                };
1100            };
1101
1102
1103        };
1104
1105        return intReturn;
1106    },
1107    GetMaxArrayItemNumberValue: function (array, propertyname) {
1108        var _ParentObject = this;
1109        var intReturn = 0;
1110        for (var i = 0; i < array.length; i++) {
1111
1112            var objItem = array[i];
1113            if (objItem[propertyname] != undefined) {
1114                if (_ParentObject.IsNumeric(objItem[propertyname].toString()) == true) {
1115                    if (parseFloat(objItem[propertyname]) > intReturn) {
1116                        intReturn = parseFloat(objItem[propertyname]);
1117                    };
1118                };
1119            };
1120
1121
1122        };
1123
1124        return intReturn;
1125    },
1126    GetMinArrayItemNumberValue: function (array, propertyname) {
1127        var _ParentObject = this;
1128        var intReturn = 1000000000000000000;
1129        for (var i = 0; i < array.length; i++) {
1130
1131            var objItem = array[i];
1132            if (objItem[propertyname] != undefined) {
1133                if (_ParentObject.IsNumeric(objItem[propertyname].toString()) == true) {
1134                    if (parseFloat(objItem[propertyname]) < intReturn) {
1135                        intReturn = parseFloat(objItem[propertyname]);
1136                    };
1137                };
1138            };
1139
1140
1141        };
1142
1143        if (array.length == 0) {
1144            intReturn = 0;
1145        };
1146        return intReturn;
1147    },
1148    ConvertArrayToCommSeperatedString: function (array) {
1149
1150        var _ParentObject = this;
1151        var strFinal = "";
1152        wc$.each(array, function (indexForArray) {
1153
1154            strFinal += array[indexForArray].toString() + ",";
1155
1156        });
1157
1158        if (strFinal.length > 1) {
1159            strFinal = strFinal.substring(0, strFinal.length - 1)
1160        };
1161        return strFinal;
1162
1163
1164    },
1165    ConvertCommSeperatedStringToArray: function (commaseperatedstring) {
1166
1167        var _ParentObject = this;
1168        return _ParentObjectGetArrayFromCSV(commaseperatedstring, ",", "string");
1169
1170
1171    },
1172    GetPropertyNamesOfObjectsInArray: function (array) {
1173
1174        var _ParentObject = this;
1175        var aryPropertyNames = [];
1176        if (array.length > 0) {
1177            var SourceObject = array[0];
1178            for (var prop in SourceObject) {
1179                if (SourceObject.hasOwnProperty(prop) == true) {
1180
1181                    if (prop != "_events" && prop != "uid" && prop != "parent") {
1182                        aryPropertyNames.push(prop.toString());
1183                    }
1184
1185                };
1186
1187
1188            };
1189        };
1190
1191
1192        return aryPropertyNames;
1193    },
1194    GetSelectedObjectsInArray: function (array, selectedbooleanpropertyname) {
1195        var _ParentObject = this;
1196        var ary = [];
1197        wc$.each(array, function (index) {
1198            var obj = array[index];
1199            if (selectedbooleanpropertyname != undefined) {
1200                //selectedbooleanpropertyname
1201                if (_ParentObject.GetObjectPropertyValue(obj, selectedbooleanpropertyname) == true) {
1202
1203                    ary.push(obj);
1204
1205
1206                };
1207            }
1208            else {
1209                if (_ParentObject.GetObjectPropertyValue(obj, "ObjectIsSelected") == true) {
1210
1211                    ary.push(obj);
1212
1213
1214                };
1215            };
1216
1217
1218        });
1219        return ary;
1220    },
1221    GetUnSelectedObjectsInArray: function (array, selectedbooleanpropertyname) {
1222        var _ParentObject = this;
1223        var ary = [];
1224        wc$.each(array, function (index) {
1225            var obj = array[index];
1226            if (selectedbooleanpropertyname != undefined) {
1227                //selectedbooleanpropertyname
1228                if (_ParentObject.GetObjectPropertyValue(obj, selectedbooleanpropertyname) == false) {
1229
1230                    ary.push(obj);
1231
1232
1233                };
1234            }
1235            else {
1236                if (_ParentObject.GetObjectPropertyValue(obj, "ObjectIsSelected") == false) {
1237
1238                    ary.push(obj);
1239
1240
1241                };
1242            };
1243
1244
1245        });
1246        return ary;
1247    },
1248    GetSelectedObjectsInArrayIDValues: function (array, idpropertyname) {
1249        var _ParentObject = this;
1250        var arySelectedIDs = [];
1251        wc$.each(_ParentObject.GetSelectedObjectsInArray(array), function (index, value) {
1252
1253            arySelectedIDs.push(_ParentObject.GetObjectPropertyValue(value, idpropertyname));
1254        });
1255
1256        return arySelectedIDs;
1257    },
1258    GetUnSelectedObjectsInArrayIDValues: function (array, idpropertyname) {
1259        var _ParentObject = this;
1260        var arySelectedIDs = [];
1261        wc$.each(_ParentObject.GetUnSelectedObjectsInArray(array), function (index, value) {
1262
1263            arySelectedIDs.push(_ParentObject.GetObjectPropertyValue(value, idpropertyname));
1264        });
1265
1266        return arySelectedIDs;
1267    },
1268    IsObjectAnArray: function (object) {
1269        if (object instanceof Array) {
1270            return true;
1271        } else {
1272            return false;
1273        }
1274    },
1275    RemoveObjectsWithPropertyValueFromArray: function (array, propertyname, value) {
1276
1277        var _ParentObject = this;
1278        //var aryNewArray = [];
1279        for (var intItemToRemoveIndex = 0; intItemToRemoveIndex < array.length;) {
1280
1281            var obj = array[intItemToRemoveIndex];
1282            if (_ParentObject.GetObjectPropertyValue(obj, propertyname) == value) {
1283                //do nothing 
1284                array.splice(intItemToRemoveIndex, 1);
1285                intItemToRemoveIndex = intItemToRemoveIndex - 1;
1286            };
1287
1288            intItemToRemoveIndex = intItemToRemoveIndex + 1;
1289        };
1290
1291
1292    },
1293    RemoveObjectsWithPropertyValueGreaterThanFromArray: function (array, propertyname, value) {
1294
1295        var _ParentObject = this;
1296        //var aryNewArray = [];
1297        for (var intItemToRemoveIndex = 0; intItemToRemoveIndex < array.length;) {
1298
1299            var obj = array[intItemToRemoveIndex];
1300            if (_ParentObject.GetObjectPropertyValue(obj, propertyname) > value) {
1301
1302                array.splice(intItemToRemoveIndex, 1);
1303                intItemToRemoveIndex = intItemToRemoveIndex - 1;
1304            };
1305
1306            intItemToRemoveIndex = intItemToRemoveIndex + 1;
1307        };
1308
1309
1310    },
1311    RemoveObjectsWithPropertyValueLessThanFromArray: function (array, propertyname, value) {
1312        var _ParentObject = this;
1313        for (var intItemToRemoveIndex = 0; intItemToRemoveIndex < array.length;) {
1314
1315            var obj = array[intItemToRemoveIndex];
1316            if (_ParentObject.GetObjectPropertyValue(obj, propertyname) < value) {
1317
1318                array.splice(intItemToRemoveIndex, 1);
1319                intItemToRemoveIndex = intItemToRemoveIndex - 1;
1320            };
1321
1322            intItemToRemoveIndex = intItemToRemoveIndex + 1;
1323        };
1324    },
1325    RemoveExpiredObjectsFromArrayOfDateAndTime: function (array, datepropertyname, timepropertyname, value) {
1326        var _ParentObject = this;
1327
1328        if (value instanceof Date) {
1329            //console.log("Control value: " + value + " is a date");
1330
1331            for (var intItemToRemoveIndex = 0; intItemToRemoveIndex < array.length;) {
1332                var obj = array[intItemToRemoveIndex];
1333                var datevalue = _ParentObject.GetObjectPropertyValue(obj, datepropertyname);
1334                
1335                //console.log("Property value: " + datevalue + " is a date");
1336
1337                if (datevalue instanceof Date) {
1338                    datevalue = _ParentObject.GetDateFromDateAndTimeString(datevalue, _ParentObject.GetObjectPropertyValue(obj, timepropertyname));
1339
1340                    if (_ParentObject.GetObjectPropertyValue(obj, timepropertyname) == "") {
1341                        datevalue.setDate(datevalue.getDate() + 1);
1342                    }
1343                    
1344                    //console.log("New Date: " + datevalue);
1345                    if (datevalue < value) {
1346                        array.splice(intItemToRemoveIndex, 1);
1347                        intItemToRemoveIndex = intItemToRemoveIndex - 1;
1348                    }
1349                }
1350
1351                intItemToRemoveIndex = intItemToRemoveIndex + 1;
1352            }
1353        }
1354    },
1355    RemoveObjectsFromArrayBeforeOfDateAndTime: function (array, datepropertyname, timepropertyname, value) {
1356        var _ParentObject = this;
1357
1358        if (value instanceof Date) {
1359            for (var intItemToRemoveIndex = 0; intItemToRemoveIndex < array.length;) {
1360                var obj = array[intItemToRemoveIndex];
1361                var datevalue = _ParentObject.GetObjectPropertyValue(obj, datepropertyname);
1362
1363                if (datevalue instanceof Date) {
1364                    datevalue = _ParentObject.GetDateFromDateAndTimeString(datevalue, _ParentObject.GetObjectPropertyValue(obj, timepropertyname));
1365
1366                    if (datevalue > value) {
1367                        array.splice(intItemToRemoveIndex, 1);
1368                        intItemToRemoveIndex = intItemToRemoveIndex - 1;
1369                    }
1370                }
1371
1372                intItemToRemoveIndex = intItemToRemoveIndex + 1;
1373            }
1374        }
1375    },
1376    GetObjectsWithoutPropertyValueFromArray: function (array, propertyname, value) {
1377
1378        var _ParentObject = this;
1379        var aryNewArray = [];
1380
1381        wc$.each(array, function (indexGetObjectsWithoutPropertyValueFromArray) {
1382            var objGetObjectsWithoutPropertyValueFromArray = array[indexGetObjectsWithoutPropertyValueFromArray];
1383            if (_ParentObject.GetObjectPropertyValue(objGetObjectsWithoutPropertyValueFromArray, propertyname) == value) {
1384                //do nothing 
1385            }
1386            else {
1387                aryNewArray.push(objGetObjectsWithoutPropertyValueFromArray);
1388            };
1389
1390
1391
1392        });
1393
1394        return aryNewArray;
1395
1396    },
1397    SortArrayByStringPropertyASC: function (array, propertyname) {
1398
1399        array.sort(function (a, b) {
1400            if (a[propertyname] != undefined) {
1401                var valueA = a[propertyname].toString().toLowerCase();
1402                var valueB = b[propertyname].toString().toLowerCase();
1403                if (valueA < valueB) //sort string ascending
1404                    return -1;
1405                if (valueA > valueB)
1406                    return 1;
1407                return 0;//default return value (no sorting)
1408            }
1409            else {
1410                return 0;//default return value (no sorting)
1411            };
1412
1413
1414        });
1415    },
1416    SortArrayByStringPropertyDESC: function (array, propertyname) {
1417        array.sort(function (a, b) {
1418            if (a[propertyname] != undefined) {
1419                var valueA = a[propertyname].toString().toLowerCase();
1420                var valueB = b[propertyname].toString().toLowerCase();
1421                if (valueA > valueB) //sort string ascending
1422                    return -1;
1423                if (valueA < valueB)
1424                    return 1;
1425                return 0;//default return value (no sorting)
1426            }
1427            else {
1428                return 0;//default return value (no sorting)
1429            };
1430
1431        });
1432    },
1433    SortArrayByNumberPropertyASC: function (array, propertyname) {
1434
1435        array.sort(function (a, b) {
1436            if (a[propertyname] != undefined) {
1437                return a[propertyname] - b[propertyname];
1438            }
1439            else {
1440                return 0;//default return value (no sorting)
1441            };
1442
1443        });
1444    },
1445    SortArrayByNumberPropertyDESC: function (array, propertyname) {
1446
1447        array.sort(function (a, b) {
1448            if (a[propertyname] != undefined) {
1449                return b[propertyname] - a[propertyname];
1450            }
1451            else {
1452                return 0;//default return value (no sorting)
1453            };
1454
1455        });
1456    },
1457    SortArrayByDatePropertyASC: function (array, propertyname) {
1458
1459        array.sort(function (a, b) {
1460            if (a[propertyname] != undefined) {
1461                var dateA = new Date(a[propertyname]);
1462                var dateB = new Date(b[propertyname]);
1463                return dateA - dateB;
1464            }
1465            else {
1466                return 0;//default return value (no sorting)
1467            };
1468
1469
1470        });
1471    },
1472    SortArrayByDatePropertyDESC: function (array, propertyname) {
1473
1474        array.sort(function (a, b) {
1475            if (a[propertyname] != undefined) {
1476                var dateA = new Date(a[propertyname]);
1477                var dateB = new Date(b[propertyname]);
1478                return dateB - dateA;
1479            }
1480            else {
1481                return 0;//default return value (no sorting)
1482            };
1483
1484
1485        });
1486    },
1487    AppendArrayToExistingArray: function (ExistingArray, ArrayToAppend) {
1488        var _ParentObject = this;
1489        if (ArrayToAppend.length > 0) {
1490
1491            for (var indexAppendArrayToExistingArray = 0; indexAppendArrayToExistingArray < ArrayToAppend.length; indexAppendArrayToExistingArray++) {
1492                ExistingArray.push(_ParentObject.CloneObject(ArrayToAppend[indexAppendArrayToExistingArray]));
1493            };
1494
1495
1496        };
1497
1498    },
1499    AddObjectToBeginningOfArray: function (Array, Object) {
1500        Array.splice(0, 0, Object);
1501    },
1502
1503    //String Functions
1504    StringToDate: function (value) {
1505        var date = Date.parse("01/01/1900");
1506
1507        //Most date strings
1508        if (isNaN(Date.parse(value))) {
1509
1510            //Try JSON formatted date string
1511            if (!isNaN(Date.parse(this.JSONStringToDate(value)))) {
1512                date = Date.parse(this.JSONStringToDate(value));
1513            }
1514
1515        } else {
1516            date = Date.parse(value);
1517        }
1518
1519        return new Date(date);
1520    },
1521    StringToDateWithoutTimeZoneAdjustment: function (value) {
1522        /// <summary>tries to get the date from a string as the literal date (no timezone changes). falls back to standard date parse if it fails.</summary>
1523
1524        var date = new Date();
1525
1526        //Most date strings
1527        //Try JSON formatted date string
1528        date = this.JSONStringToDate(value);
1529
1530        if (isNaN(date))
1531            date = Date.parse(value);
1532
1533        return date;
1534    },
1535    StringToInteger: function (value) {
1536        return parseInt(value);
1537    },
1538    StringToFloat: function (value) {
1539        return parseFloat(value);
1540    },
1541    StringToBoolean: function (val) {
1542        var objReturnValue = undefined;
1543        if (val.toLowerCase() === 'true' || val.toLowerCase() === 'yes' || val === 1) {
1544            objReturnValue = true;
1545
1546        };
1547        if (val.toLowerCase() === 'false' || val.toLowerCase() === 'no' || val === 0) {
1548            objReturnValue = false;
1549        };
1550
1551        return objReturnValue;
1552    },
1553    GetTimeStringFromDate: function (date) {
1554        var intHours = date.getHours();
1555        var intMinutes = date.getMinutes();
1556
1557        var strHours = "";
1558        var strMinutes = "";
1559        var strAMPM = " ";
1560        var strReturn = "";
1561
1562        //minutes
1563        strMinutes = intMinutes.toString();
1564        if (strMinutes.length == 1) {
1565            strMinutes = "0" + strMinutes;
1566        }
1567
1568        //Hours
1569        if (intHours > 12) {
1570            strAMPM = "PM";
1571            strHours = (intHours - 12).toString();
1572        }
1573        if (intHours == 12) {
1574            strAMPM = "PM";
1575            strHours = "12";
1576        }
1577        if (intHours < 12) {
1578            strAMPM = "AM";
1579            strHours = intHours.toString();
1580        }
1581
1582        strReturn = strHours + ":" + strMinutes + " " + strAMPM;
1583        return strReturn;
1584    },
1585    GetDateFromDateAndTimeString: function (date, time) {
1586        if (date instanceof Date && time != "" && time != null) {            
1587            var yyyy = date.getFullYear().toString();
1588            var mm = (date.getMonth() + 1).toString(); // getMonth() is zero-based
1589            var dd = date.getDate().toString();
1590            var strDate = yyyy + "/" + mm + "/" + dd + " " + time
1591            date = new Date(strDate)
1592
1593        }
1594
1595        return date;
1596    },
1597    IsNumeric: function (text) {
1598        return !isNaN(parseFloat(text)) && isFinite(text);
1599    },
1600    ReplaceAll: function replaceAll(str, find, replace) {
1601        return str.replace(new RegExp(find, 'g'), replace);
1602    },
1603    TimeOfDayArrayWithBlankItem: ["", "12:00 Midnight", "12:15 AM", "12:30 AM", "12:45 AM", "1:00 AM", "1:15 AM", "1:30 AM", "1:45 AM", "2:00 AM", "2:15 AM", "2:30 AM", "2:45 AM", "3:00 AM", "3:15 AM", "3:30 AM", "3:45 AM", "4:00 AM", "4:15 AM", "4:30 AM", "4:45 AM", "5:00 AM", "5:15 AM", "5:30 AM", "5:45 AM", "6:00 AM", "6:15 AM", "6:30 AM", "6:45 AM", "7:00 AM", "7:15 AM", "7:30 AM", "7:45 AM", "8:00 AM", "8:15 AM", "8:30 AM", "8:45 AM", "9:00 AM", "9:15 AM", "9:30 AM", "9:45 AM", "10:00 AM", "10:15 AM", "10:30 AM", "10:45 AM", "11:00 AM", "11:15 AM", "11:30 AM", "11:45 AM", "12:00 Noon", "12:15 PM", "12:30 PM", "12:45 PM", "1:00 PM", "1:15 PM", "1:30 PM", "1:45 PM", "2:00 PM", "2:15 PM", "2:30 PM", "2:45 PM", "3:00 PM", "3:15 PM", "3:30 PM", "3:45 PM", "4:00 PM", "4:15 PM", "4:30 PM", "4:45 PM", "5:00 PM", "5:15 PM", "5:30 PM", "5:45 PM", "6:00 PM", "6:15 PM", "6:30 PM", "6:45 PM", "7:00 PM", "7:15 PM", "7:30 PM", "7:45 PM", "8:00 PM", "8:15 PM", "8:30 PM", "8:45 PM", "9:00 PM", "9:15 PM", "9:30 PM", "9:45 PM", "10:00 PM", "10:15 PM", "10:30 PM", "10:45 PM", "11:00 PM", "11:15 PM", "11:30 PM", "11:45 PM"],
1604    TimeArrayWithBlankValue: [{ value: "" }, { value: "12:00 AM" }, { value: "12:15 AM" }, { value: "12:30 AM" }, { value: "12:45 AM" }, { value: "1:00 AM" }, { value: "1:15 AM" }, { value: "1:30 AM" }, { value: "1:45 AM" }, { value: "2:00 AM" }, { value: "2:15 A
1604M" }, { value: "2:30 AM" }, { value: "2:45 AM" }, { value: "3:00 AM" }, { value: "3:15 AM" }, { value: "3:30 AM" }, { value: "3:45 AM" }, { value: "4:00 AM" }, { value: "4:15 AM" }, { value: "4:30 AM" }, { value: "4:45 AM" }, { value: "5:00 AM" }, { value: "5:15 AM" }, { value: "5:30 AM" }, { value: "5:45 AM" }, { value: "6:00 AM" }, { value: "6:15 AM" }, { value: "6:30 AM" }, { value: "6:45 AM" }, { value: "7:00 AM" }, { value: "7:15 AM" }, { value: "7:30 AM" }, { value: "7:45 AM" }, { value: "8:00 AM" }, { value: "8:15 AM" }, { value: "8:30 AM" }, { value: "8:45 AM" }, { value: "9:00 AM" }, { value: "9:15 AM" }, { value: "9:30 AM" }, { value: "9:45 AM" }, { value: "10:00 AM" }, { value: "10:15 AM" }, { value: "10:30 AM" }, { value: "10:45 AM" }, { value: "11:00 AM" }, { value: "11:15 AM" }, { value: "11:30 AM" }, { value: "11:45 AM" }, { value: "12:00 PM" }, { value: "12:15 PM" }, { value: "12:30 PM" }, { value: "12:45 PM" }, { value: "1:00 PM" }, { value: "1:15 PM" }, { value: "1:30 PM" }, { value: "1:45 PM" }, { value: "2:00 PM" }, { value: "2:15 PM" }, { value: "2:30 PM" }, { value: "2:45 PM" }, { value: "3:00 PM" }, { value: "3:15 PM" }, { value: "3:30 PM" }, { value: "3:45 PM" }, { value: "4:00 PM" }, { value: "4:15 PM" }, { value: "4:30 PM" }, { value: "4:45 PM" }, { value: "5:00 PM" }, { value: "5:15 PM" }, { value: "5:30 PM" }, { value: "5:45 PM" }, { value: "6:00 PM" }, { value: "6:15 PM" }, { value: "6:30 PM" }, { value: "6:45 PM" }, { value: "7:00 PM" }, { value: "7:15 PM" }, { value: "7:30 PM" }, { value: "7:45 PM" }, { value: "8:00 PM" }, { value: "8:15 PM" }, { value: "8:30 PM" }, { value: "8:45 PM" }, { value: "9:00 PM" }, { value: "9:15 PM" }, { value: "9:30 PM" }, { value: "9:45 PM" }, { value: "10:00 PM" }, { value: "10:15 PM" }, { value: "10:30 PM" }, { value: "10:45 PM" }, { value: "11:00 PM" }, { value: "11:15 PM" }, { value: "11:30 PM" }, { value: "11:45 PM" }],
1605    StateArray: [{ State: "AK" }, { State: "AL" }, { State: "AR" }, { State: "AZ" }, { State: "CA" }, { State: "CO" }, { State: "CT" }, { State: "DE" }, { State: "DC" }, { State: "FL" }, { State: "GA" }, { State: "HI" }, { State: "IA" }, { State: "ID" }, { State: "IL" }, { State: "IN" }, { State: "KS" }, { State: "KY" }, { State: "LA" }, { State: "ME" }, { State: "MD" }, { State: "MA" }, { State: "MI" }, { State: "MN" }, { State: "MS" }, { State: "MO" }, { State: "MT" }, { State: "NC" }, { State: "ND" }, { State: "NE" }, { State: "NH" }, { State: "NJ" }, { State: "NM" }, { State: "NV" }, { State: "NY" }, { State: "OH" }, { State: "OK" }, { State: "OR" }, { State: "PA" }, { State: "RI" }, { State: "SC" }, { State: "SD" }, { State: "TN" }, { State: "TX" }, { State: "UT" }, { State: "VA" }, { State: "VT" }, { State: "WA" }, { State: "WV" }, { State: "WI" }, { State: "WY" }, { State: "AB" }, { State: "BC" }, { State: "MB" }, { State: "NB" }, { State: "NL" }, { State: "NS" }, { State: "NT" }, { State: "NU" }, { State: "ON" }, { State: "PE" }, { State: "QC" }, { State: "SK" }, { State: "YT" }, { State: "AG" }, { State: "BN" }, { State: "BS" }, { State: "CH" }, { State: "CL" }, { State: "CM" }, { State: "CP" }, { State: "DF" }, { State: "DU" }, { State: "GR" }, { State: "GT" }, { State: "JA" }, { State: "MC" }, { State: "MR" }, { State: "MX" }, { State: "NA" }, { State: "OA" }, { State: "PU" }, { State: "QE" }, { State: "QR" }, { State: "SI" }, { State: "SL" }, { State: "SO" }, { State: "TB" }, { State: "TL" }, { State: "TM" }, { State: "VE" }, { State: "YU" }, { State: "ZA" }],
1606    StateList: ["AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", "WV", "WI", "WY", "AB", "BC", "MB", "NB", "NL", "NS", "NT", "NU", "ON", "PE", "QC", "SK", "YT", "AG", "BN", "BS", "CH", "CL", "CM", "CP", "DF", "DU", "GR", "GT", "JA", "MC", "MR", "MX", "NA", "OA", "PU", "QE", "QR", "SI", "SL", "SO", "TB", "TL", "TM", "VE", "YU", "ZA"],
1607    FormatAsCurrency: function (num) {
1608        num = num.toString().replace(/\$|\,/g, '');
1609        if (isNaN(num)) num = "0";
1610        sign = (num == (num = Math.abs(num)));
1611        num = Math.floor(num * 100 + 0.50000000001);
1612        cents = num % 100;
1613        num = Math.floor(num / 100).toString();
1614        if (cents < 10) cents = "0" + cents;
1615        for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++)
1616            num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
1617        return (((sign) ? '' : '-') + '$' + num + '.' + cents);
1618    },
1619    GetNewID: function (array, propertyname) {
1620        //Create new IDs starting with -1 and decreasing
1621        if (this.GetMinArrayItemNumberValue(array, propertyname) < 1) {
1622            return this.GetMinArrayItemNumberValue(array, propertyname) - 1;
1623        } else {
1624            return 0;
1625        }
1626    },
1627    GetRandomString: function (length) {
1628
1629        var text = "";
1630        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1631
1632        for (var i = 0; i < length; i++) {
1633            text += possible.charAt(Math.floor(Math.random() * possible.length));
1634        }
1635
1636        return text;
1637
1638    },
1639    ReplaceLineBreaksWithBRTag: function (text) {
1640        return text.replace(/\n/g, '<br />');
1641    },
1642    Trim: function (str) {
1643        str = str.replace(/^\s+|\s+$/g, '');
1644        return str;
1645    },
1646    Startswith: function (string, startswith) {
1647
1648        if (typeof string == 'string' || string instanceof String) {
1649            return string.indexOf(startswith) == 0;
1650        }
1651        else {
1652            return false;
1653        };
1654
1655
1656    },
1657    Contains: function (string, stringcontains) {
1658
1659        return string.indexOf(stringcontains) != -1;
1660
1661    },
1662    ToLowerAndTrim: function (string) {
1663        var _ParentObject = this;
1664
1665        return _ParentObject.Trim(string).toLowerCase();
1666    },
1667
1668    //Number Functions
1669    GetRandomNumber: function () {
1670        var randomnumber = Math.floor(Math.random() * 11);
1671        return randomnumber;
1672    },
1673    GetRandomNumberLessThanZero: function () {
1674        var randomnumber = Math.floor(Math.random() * 11);
1675        if (randomnumber > 0) {
1676            randomnumber = randomnumber * -1;
1677        };
1678        return randomnumber;
1679    },
1680    ConvertNumericStringToInteger: function (StringNumber) {
1681        return parseInt(StringNumber, 10);
1682    },
1683    //Date Functions
1684    secondsInMilliseconds: function (numseconds) {
1685
1686        return numseconds * 1000;
1687    },
1688    minutesInMilliseconds: function (numminutes) {
1689        var _ParentObject = this;
1690        return _ParentObject.secondsInMilliseconds(numminutes * 60);
1691    },
1692    hoursInMilliseconds: function (numhours) {
1693        var _ParentObject = this;
1694        return _ParentObject.minutesInMilliseconds(numhours * 60);
1695    },
1696    daysInMilliseconds: function (numdays) {
1697        var _ParentObject = this;
1698        return _ParentObject.hoursInMilliseconds(numdays * 24);
1699    },
1700    yearsInMilliseconds: function (numyears) {
1701        var _ParentObject = this;
1702        return _ParentObject.daysInMilliseconds(numyears * 365);
1703    },
1704    GetDateWithNoTime: function (d) {
1705
1706        var intYear = d.getFullYear();
1707        var intMonth = d.getMonth();
1708        var intDay = d.getDate();
1709
1710        var objReturnDate = new Date(intYear, intMonth, intDay, 0, 0, 0, 0);
1711        return objReturnDate;
1712    },
1713    GetCurrentDateWithNoTime: function () {
1714
1715
1716        var d = new Date();
1717        var intYear = d.getFullYear();
1718        var intMonth = d.getMonth();
1719        var intDay = d.getDate();
1720
1721        var objReturnDate = new Date(intYear, intMonth, intDay, 0, 0, 0, 0);
1722        return objReturnDate;
1723    },
1724
1725    //Dialog Functions
1726    DisplayDialogAlert: function (message, title) {
1727
1728        if (title = undefined) {
1729            title = "Alert";
1730        };
1731        jAlert(message, title);
1732
1733    },
1734    DisplayDialogOK: function (message, title) {
1735
1736        jAlert(message, title);
1737
1738    },
1739    DisplayDialogTemplate: function (title, template) {
1740        var kendoWindow = $("<div />").kendoWindow({
1741            title: title,
1742            resizable: false,
1743            modal: true,
1744            content: {
1745                template: template
1746            },
1747            close: function () { kendoWindow.data("kendoWindow").destroy() }
1748        });
1749        kendoWindow.data("kendoWindow").center().open();
1750    },
1751    DisplayDialogOKCancel: function (message, title, okfunction, cancelfunction) {
1752        jConfirm(message, title, function (r) {
1753            if (r == true) {
1754                if (okfunction != null && okfunction != undefined) {
1755                    okfunction();
1756                }
1757                return true;
1758            }
1759            else {
1760                if (cancelfunction != null && cancelfunction != undefined) {
1761                    cancelfunction();
1762                }
1763                return false;
1764            }
1765        });
1766    },
1767    DisplayDialogYesNo: function (message, title, okfunction, cancelfunction) {
1768        if (title == undefined) {
1769            title = "Confirmation";
1770        };
1771
1772        jYesNo(message, title, function (r) {
1773            if (r == true) {
1774                if (okfunction != null && okfunction != undefined) {
1775                    okfunction();
1776                }
1777                return true;
1778            }
1779            else {
1780                if (cancelfunction != null && cancelfunction != undefined) {
1781                    cancelfunction();
1782                }
1783                return false;
1784            }
1785        });
1786    },
1787
1788    DisplayDialogYesNoOkID: function (message, title, okfunction, cancelfunction, okid) {
1789        var answer = confirm(message);
1790
1791        if (answer) {
1792            if (okfunction != null && okfunction != undefined) {
1793                okfunction(okid);
1794            }
1795            return true;
1796        }
1797        else {
1798            if (cancelfunction != null && cancelfunction != undefined) {
1799                cancelfunction();
1800            }
1801            return false;
1802        }
1803
1804        //jYesNo(message, title, function (r) {
1805        //    if (r == true) {
1806        //        if (okfunction != null && okfunction != undefined) {
1807        //            okfunction(okid);
1808        //        }
1809        //    }
1810        //    else {
1811        //        if (cancelfunction != null && cancelfunction != undefined) {
1812        //            cancelfunction();
1813        //        }
1814
1815        //    }
1816
1817
1818        //});
1819    },
1820    DisplayWaitDialog: function (dialogid, title) {
1821        //var _ParentObject = this;
1822
1823        var strWindowID = 'windowWait';
1824        if (dialogid != undefined) {
1825            strWindowID = strWindowID + dialogid;
1826        };
1827        //var strProgressBarID = 'progressbarWait' + dialogid;
1828        var strTitle = "Loading...";
1829        if (title != undefined) {
1830            strTitle = title;
1831        };
1832        //var objWindow = wc$('<div style="height:150px;width:150px" id="' + strWindowID + '"> <div id="' + strProgressBarID + '" ></div> </div>');
1833
1834        //if (!objWindow.data("kendoWindow")) {
1835        //    objWindow.kendoWindow({
1836        //        animation: false,
1837        //        title: strTitle,
1838        //        draggable: false,
1839        //        modal: true,
1840        //        resizable: false,
1841        //        open: function () {
1842        //            kendo.ui.progress(wc$("#" + strProgressBarID), true);
1843        //        }
1844
1845        //    });
1846        //};
1847
1848        ////the following hides the close x on the window
1849        //wc$("#" + strWindowID).parent().find(".k-window-action").css("visibility", "hidden");
1850
1851        //objWindow.data("kendoWindow").center().open();
1852
1853        //wc$.blockUI({ message: wc$('<div id="' + strWindowID + '">' + strTitle + '</div>') });
1854        wc$.blockUI({
1855            message: '<div style="padding: 15px" id="' + strWindowID + '"><h2><img style="margin:5px" src="/External/WCControls/v12/Images/ajax-loader.gif" />' + strTitle + '</h2></div>',
1856            cursorReset: 'default',
1857            overlayCSS: {
1858                backgroundColor: '#000',
1859                opacity: 0.9,
1860                cursor: 'wait'
1861            }
1862
1863        });
1864
1865
1866    },
1867    CloseWaitDialog: function (dialogid) {
1868        //var strWindowID = 'windowWait' + dialogid;
1869        //var strProgressBarID = 'progressbarWait' + dialogid;
1870        //kendo.ui.progress(wc$("#" + strProgressBarID), false);
1871
1872        //var objWindow = wc$("#" + strWindowID).closest(".k-window-content").data("kendoWindow")
1873        //if (objWindow != undefined) {
1874        //    objWindow.destroy();
1875        //};
1876
1877        wc$.unblockUI();
1878
1879
1880    },
1881
1882    //Export functions
1883    GetCSVSafeValue: function (value) {
1884
1885        var strValue;
1886        if (value == undefined) {
1887            strValue = '""';
1888        }
1889
1890        else {
1891            strValue = value.toString();
1892            strVlaue = strValue.replace(/"/g, '""');
1893            strValue = '"' + strValue + '"';
1894
1895        }
1896
1897
1898        return strValue;
1899
1900    },
1901    GetCSVFromArray: function (objArray, objPropertyNames) {
1902
1903        var _ParentObject = this;
1904
1905        var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
1906
1907        var str = '';
1908        var line = '';
1909
1910
1911
1912
1913        for (var index = 0; index < objPropertyNames.length; index++) {
1914            //create header with property names
1915            var value = objPropertyNames[index];
1916
1917
1918            if (index == 0) {
1919                line += _ParentObject.GetCSVSafeValue(value);
1920            }
1921            else {
1922                line += ', ' + _ParentObject.GetCSVSafeValue(value);
1923            }
1924
1925
1926        }
1927
1928        str += line + '\r\n';
1929
1930
1931        for (var i = 0; i < array.length; i++) {
1932            //reset and reuse
1933            line = '';
1934
1935
1936            for (var index = 0; index < objPropertyNames.length; index++) {
1937
1938                var strFieldName = objPropertyNames[index];
1939                var value = array[i].get(strFieldName)
1940
1941                if (index == 0) {
1942                    line += _ParentObject.GetCSVSafeValue(value);
1943                }
1944                else {
1945                    line += ', ' + _ParentObject.GetCSVSafeValue(value);
1946                }
1947
1948
1949            }
1950
1951            str += line + '\r\n';
1952        }
1953
1954        // window.open('data:application/csv;charset=utf-8,' + escape(str));
1955
1956
1957        return str;
1958
1959    },
1960    GetArrayFromCSV: function (CSV, Seperator, expectedtype) {
1961        var _ParentObject = this;
1962
1963        if (Seperator == undefined) {
1964            Seperator = ","
1965        };
1966
1967        if (_ParentObject.Trim(CSV) == "") {
1968            aryValues = new Array; //empty
1969        }
1970        else {
1971            var aryValues = CSV.split(Seperator);
1972
1973            for (var intCurrent = 0; intCurrent < aryValues.length; intCurrent++) {
1974
1975                var result = aryValues[intCurrent];
1976
1977                if (expectedtype.toLowerCase() == 'number') {
1978
1979
1980                    if (result == '') {
1981                        result = 0;
1982                    }
1983                    else {
1984                        result = parseFloat(result);
1985                    };
1986                };
1987
1988                if (expectedtype.toLowerCase() == 'date') {
1989                    if (result == '') {
1990                        result = new Date();
1991                    }
1992                    else {
1993                        result = Date.parse(result);
1994                    };
1995                };
1996
1997                if (expectedtype.toLowerCase() == 'boolean') {
1998                    if (result.toLowerCase() == 'true') {
1999                        result = true;
2000                    }
2001                    else {
2002                        result = false;
2003                    };
2004                };
2005            };
2006
2007
2008            if (aryValues.length == 0) {
2009                aryValues = new Array; //empty
2010            };
2011        };
2012
2013        return aryValues;
2014    },
2015    GetCSVSafeValue: function (value) {
2016
2017        var strValue;
2018        if (value == undefined) {
2019            strValue = '""';
2020        }
2021
2022        else {
2023            strValue = value.toString();
2024            strVlaue = strValue.replace(/"/g, '""');
2025            strValue = '"' + strValue + '"';
2026
2027        }
2028
2029
2030        return strValue;
2031
2032    },
2033    DownloadCSVFile: function (array, propertynames) {
2034
2035        var _ParentObject = this;
2036        var objMasterArray = [];
2037
2038        if (propertynames == undefined) {
2039            propertynames = _ParentObject.GetPropertyNamesOfObjectsInArray(array);
2040            var str = propertynames.join(",");
2041        };
2042
2043        for (var i = 0; i < array.length; i++) {
2044
2045            var objLineArray = [];
2046            for (var index = 0; index < propertynames.length; index++) {
2047
2048                var strFieldName = propertynames[index];
2049                var obj = array[i];
2050                var value = _ParentObject.GetObjectPropertyValue(obj, strFieldName);
2051
2052                objLineArray.push(value);
2053            }
2054
2055            objMasterArray.push(objLineArray)
2056        }
2057
2058        var objPostData = {
2059            Namespace: 'Weblink_Core',
2060            TypeName: 'WC_ExcelUtilities',
2061            MethodName: 'CreateCSVFileOnServer',
2062            ColumnHeaders: propertynames,
2063            Values: objMasterArray
2064
2065        };
2066        var strURL = _ParentObject.GetGatewayResponse(objPostData, null);
2067
2068        window.open(strURL);
2069
2070
2071    },
2072    DownloadExcelFile: function (array, propertynames) {
2073
2074        var _ParentObject = this;
2075        var objMasterArray = [];
2076
2077        if (propertynames == undefined) {
2078            propertynames = _ParentObject.GetPropertyNamesOfObjectsInArray(array);
2079        };
2080
2081        for (var i = 0; i < array.length; i++) {
2082
2083            var objLineArray = [];
2084            for (var index = 0; index < propertynames.length; index++) {
2085
2086                var strFieldName = propertynames[index];
2087                var obj = array[i];
2088                var value = obj.get(strFieldName);
2089
2090                objLineArray.push(value);
2091            }
2092
2093            objMasterArray.push(objLineArray)
2094        }
2095
2096        var objPostData = {
2097            Namespace: 'Weblink_Core',
2098            TypeName: 'WC_ExcelUtilities',
2099            MethodName: 'CreateExcelCSVFileOnServer',
2100            ColumnHeaders: propertynames,
2101            Values: objMasterArray
2102
2103        };
2104        var strURL = _ParentObject.GetGatewayResponse(objPostData, null);
2105
2106        window.open(strURL);
2107
2108
2109    },
2110
2111    //Control Functions
2112    AddCheckboxBinding: function (gridControl, checkboxClass, vmField) {
2113        //gridControl = actual control object for the Kendo Grid.  Suggested to find with jQuery like this: wc$('#grdOne')
2114        //checkboxClass = string value for class assigned to the checkbox.
2115        //vmField = name of variable on model inside of VM collection.  e.g.: WC_Event.EventID would be 'EventID'
2116
2117        gridControl.on('click', '.' + checkboxClass, function () {
2118            var checked = wc$(this).is(':checked');
2119            var grid = gridControl.data().kendoGrid;
2120            var dataItem = grid.dataItem(wc$(this).closest('tr'));
2121            dataItem.set(vmField, checked);
2122        });
2123    },
2124    EvaluateToggleShow: function (e) {
2125
2126        /* EvaluateToggleShow:
2127       Toggles display of control (or comma separated IDs) identified in data-checktogglesdisplay attribute
2128       Example: 
2129           <input id="chkShowHaveQuestion" type="checkbox" onchange="mobj_ViewModel.EvaluateToggleShow(this);" data-checktogglesdisplay="txtHaveQuestion" />
2130           <input id="txtHaveQuestion" style="display: none" />
2131    */
2132        if (e.type == 'checkbox') {
2133            var targets = e.getAttribute('data-checktogglesdisplay').split(',');
2134            var targetsInverted = e.getAttribute('data-checktogglesdisplayinverted').split(',');
2135            var isChecked = e.checked;
2136
2137            for (var i = 0; i < targets.length; i++) {
2138                var targetId = wc$.trim(targets[i]);
2139                if (targetId != "") {
2140                    var target = document.getElementById(targetId);
2141
2142                    if (!isChecked) {
2143                        //Hide
2144                        target.style.display = 'none';
2145                    }
2146                    else {
2147                        //Show
2148                        switch (target.tagName) {
2149                            case 'TR':
2150                                //Table row display handling
2151                                target.style.display = 'table-row';
2152                                break;
2153                            case 'TD':
2154                                //Table cell display handling
2155                                target.style.display = 'table-cell';
2156                                break;
2157                            case 'TABLE':
2158                                //Table display handling
2159                                target.style.display = 'table';
2160                                break;
2161                            default:
2162                                //Default display handling
2163                                target.style.display = 'block';
2164                                break;
2165                        }
2166                    }
2167                }
2168            }
2169            for (var i = 0; i < targetsInverted.length; i++) {
2170                var targetId = wc$.trim(targetsInverted[i])
2171                if (targetId != "") {
2172                    var target = document.getElementById(targetId)
2173
2174                    if (isChecked) {
2175                        //Show
2176                        target.style.display = 'none';
2177                    }
2178                    else {
2179                        //Hide
2180                        switch (target.tagName) {
2181                            case 'TR':
2182                                //Table row display handling
2183                                target.style.display = 'table-row';
2184                                break;
2185                            case 'TD':
2186                                //Table cell display handling
2187                                target.style.display = 'table-cell';
2188                                break;
2189                            case 'TABLE':
2190                                //Table display handling
2191                                target.style.display = 'table';
2192                                break;
2193                            default:
2194                                //Default display handling
2195                                target.style.display = 'block';
2196                                break;
2197                        }
2198                    }
2199                }
2200            }
2201        }
2202    },
2203    EvaluateToggleCheckbox: function (e) {
2204        if (e.type == 'checkbox') {
2205            var targets = e.getAttribute('data-checktogglescheckbox').split(',');
2206            var targetsInverted = e.getAttribute('data-checktogglescheckboxinverted').split(',');
2207            var isChecked = e.checked;
2208
2209            for (var i = 0; i < targets.length; i++) {
2210                var targetId = wc$.trim(targets[i])
2211                if (targetId != "") {
2212                    var target = document.getElementById(targetId)
2213
2214                    if (!isChecked) {
2215                        //Check
2216                        target.checked = true;
2217                    }
2218                    else {
2219                        //Uncheck
2220                        target.checked = false;
2221                    }
2222                }
2223            }
2224            for (var i = 0; i < targetsInverted.length; i++) {
2225                var targetId = wc$.trim(targetsInverted[i])
2226                if (targetId != "") {
2227                    var target = document.getElementById(targetId)
2228
2229                    if (isChecked) {
2230                        //Uncheck
2231                        target.checked = true;
2232                    }
2233                    else {
2234                        //Check
2235                        target.checked = false;
2236                    }
2237                }
2238            }
2239        }
2240    },
2241    UIControlDataTypes: [{ Name: "Text", Value: "TextboxSingleLine" }, { Name: "Text (Multi-Line)", Value: "TextboxMultiLine" }, { Name: "Number (Decimal)", Value: "NumberInputDecimal" }, { Name: "Number (No Decimal)", Value: "NumberInputNoDecimal" }, { Name: "Yes-No", Value: "Checkbox" }, { Name: "Drop Down List", Value: "DropdownList" }],
2242
2243
2244    //Authenticated User Methods
2245    IsBrowserEmbeddedInSmartClient: function () {
2246        var strURL = window.location.toString();
2247        strURL = strURL.toLowerCase();
2248        var intIndex = strURL.indexOf("mp=smartclient");
2249        if (intIndex >= 0) {
2250            return true;
2251        }
2252        else {
2253            return false;
2254        }
2255    },
2256    IsBrowserNotEmbeddedInSmartClient: function () {
2257        var _ParentObject = this;
2258        if (_ParentObject.IsBrowserEmbeddedInSmartClient() == true) {
2259            return false;
2260        }
2261        else {
2262            return true;
2263        }
2264    },
2265    IsAuthenticatedWebClientUser: function () {
2266        var _ParentObject = this;
2267        var bol = false;
2268        var strValue = _ParentObject.GetCookieValue("WC_WebClientCookie", "String");
2269        //var strValue = _ParentObject.GetCookieValue("Weblink_AuthenticatedAs", "String");
2270        //WC_WebClientCookie
2271        if (strValue != undefined) {
2272            if (strValue != null) {
2273                if (strValue != '') {
2274                    var objPostData = {
2275                        Namespace: 'Weblink_Core',
2276                        TypeName: 'WC_LogonManager',
2277                        MethodName: 'IsTokenValid',
2278                        TokenToValidate: strValue
2279                    };
2280
2281                    var objData = _ParentObject.GetGatewayResponse(objPostData, null);
2282
2283                    bol = objData;
2284                };
2285            };
2286        };
2287
2288
2289
2290        return bol;
2291    },
2292    IsActionAllowedForUsersRole: function (action, allowreadonly) {
2293        var _ParentObject = this;
2294        var bol = false;
2295        var strValue = _ParentObject.GetCookieValue("WC_WebClientCookie", "String");
2296        if (action == '') { action = '' };
2297        if (strValue != undefined) {
2298            if (strValue != null) {
2299                if (strValue != '') {
2300                    var objPostData = {
2301                        Namespace: 'Weblink_Core',
2302                        TypeName: 'WC_LogonManager',
2303                        MethodName: 'IsActionAllowedForUsersRoleByToken',
2304                        UserToken: strValue,
2305                        SecurityElement: action,
2306                        AllowReadOnly: allowreadonly
2307                    };
2308
2309                    var objData = _ParentObject.GetGatewayResponse(objPostData, null);
2310
2311                    bol = objData;
2312                };
2313            };
2314        };
2315
2316        return bol;
2317    },
2318    IsNotAuthenticatedWebClientUser: function () {
2319        var _ParentObject = this;
2320        if (_ParentObject.IsAuthenticatedWebClientUser() == true) {
2321            return false;
2322        }
2323        else {
2324            return true;
2325        }
2326    },
2327    LoginIfNotAuthenticatedWebClientUser: function () {
2328        var _ParentObject = this;
2329        if (_ParentObject.IsAuthenticatedWebClientUser() == false) {
2330            var objURL = _ParentObject.GetUrlParts(window.location);
2331
2332            var strURL = 'https://' + objURL.hostname + '/external/wcpages/v12/login.aspx?page=' + encodeURIComponent('https://' + objURL.hostname + '/' + objURL.pathname + objURL.search);
2333            window.locat
2333ion.href = strURL;
2334        };
2335    },
2336    GetAuthenticatedWebClientUser: function () {
2337
2338        var _ParentObject = this;
2339        var objUser = {
2340            "UserNum": 0,
2341            "ProfileId": 0,
2342            "UserName": "",
2343            "FullName": "",
2344            "Pass": "",
2345            "LevelCode": "",
2346            "DateCreated": "1900-01-01T00:00:00",
2347            "DateChanged": "1900-01-01T00:00:00",
2348            "Email": "",
2349            "Role": "",
2350            "UserRoleID": 0,
2351            "Inactive": false,
2352            "Rate": 0.0,
2353            "WLIContact": false,
2354            "DateStarted": "1900-01-01T00:00:00",
2355            "DateInactive": "1900-01-01T00:00:00",
2356            "ContactType": "",
2357            "DepartmentID": 0,
2358            "SubDepartmentID": 0,
2359            "DMSDepartmentIDs": "7",
2360            "DMSSubDepartmentIDs": "2,3,7",
2361            "Token": "",
2362            "iPadUser": false,
2363            "ShowPasswords": false,
2364            "ObjectCollectionState": 4,
2365            "ObjectIsSelected": false,
2366            "ObjectData": null
2367        };
2368
2369        if (_ParentObject.IsAuthenticatedWebClientUser() == true) {
2370
2371          
2372            var strValue = _ParentObject.GetCookieValue("WC_WebClientCookie", "String");
2373
2374            var objPostData = {
2375                Namespace: 'Weblink_Core',
2376                TypeName: 'WC_LogonManager',
2377                MethodName: 'GetUserFromToken',
2378                portaltoken: strValue
2379            };
2380            var objData = _ParentObject.GetGatewayResponse(objPostData, null);
2381            objUser = objData;
2382        };
2383      
2384        return objUser;
2385    },
2386    //Web Portal Methods
2387    WebPortalProfile: {},
2388    IsAuthenticatedWebPortalProfile: function () {
2389        var _ParentObject = this;
2390        var intProfileID = 0;
2391        intProfileID = _ParentObject.GetCookieValue("WC_ProfileID", "number");
2392        if (intProfileID > 0) {
2393            return true;
2394        }
2395        else {
2396            return false;
2397        };
2398    },
2399    IsNotAuthenticatedWebClientUser: function () {
2400        var _ParentObject = this;
2401        if (_ParentObject.IsAuthenticatedWebPortalProfile() == true) {
2402            return false;
2403        }
2404        else {
2405            return true;
2406        }
2407    },
2408    GetWebPortalProfile: function () {
2409        var _ParentObject = this;
2410
2411        var intProfileID = _ParentObject.GetCookieValue("Weblink_ProfileID", "number");
2412
2413        var objPostData = {
2414            Namespace: 'Weblink_Core',
2415            TypeName: 'WC_WebPortalProfileManager',
2416            MethodName: 'GetWebPortalProfileFromProfileID',
2417            ProfileID: intProfileID
2418        };
2419
2420        var objData = _ParentObject.GetGatewayResponse(objPostData, null);
2421        _ParentObject.WebPortalProfile = objData;
2422        return objData;
2423    },
2424    SetWebPortalProfile: function (webportalprofile) {
2425        var _ParentObject = this;
2426        _ParentObject.WebPortalProfile = webportalprofile;
2427    },
2428    LoginIfNotAuthenticatedWebPortalProfile: function () {
2429
2430        var _ParentObject = this;
2431        if (_ParentObject.IsAuthenticatedWebPortalProfile() == false) {
2432            var objURL = _ParentObject.GetUrlParts(window.location);
2433
2434            var strURL = 'https://' + objURL.hostname + '/webportal/login?returnurl=' + encodeURIComponent('https://' + objURL.hostname + '/' + objURL.pathname + objURL.search);
2435            window.location.href = strURL;
2436        };
2437
2438
2439    },
2440
2441
2442    //Reporting
2443    GetReportViewerURL: function (reportname) {
2444
2445        var strReportName = "";
2446        if (reportname != undefined) {
2447            strReportName = "?reportname=" + reportname;
2448        };
2449        return "/external/wcpages/v12/webclient/report/report.aspx" + strReportName;
2450    },
2451    ViewReport: function (reportname) {
2452        var _ParentObject = this;
2453        var strURL = _ParentObject.GetReportViewerURL(reportname);
2454        window.open(strURL);
2455    },
2456    ViewReportWithRecordSelection: function (reportname, recordselection) {
2457        var _ParentObject = this;
2458        var strRecordSelection = "";
2459        if (recordselection != undefined) {
2460            //%7b is {  %5d is }
2461            strRecordSelection = '&recordselection=%7b' + recordselection + '%5d';
2462        };
2463        var strURL = _ParentObject.GetReportViewerURL(reportname) + strRecordSelection;
2464        window.open(strURL);
2465    },
2466    ViewReportWithParemetersToSet: function (reportname, paramsasnamevaluearray) {
2467        var _ParentObject = this;
2468        var strParams = "";
2469        if (paramsasnamevaluearray != undefined) {
2470
2471            for (var indIndexParam = 0; indIndexParam < paramsasnamevaluearray.length; indIndexParam++) {
2472
2473                var objParamObject = paramsasnamevaluearray[indIndexParam];
2474                if (objParamObject.Name == undefined || objParamObject.Value == undefined) {
2475                    alert("paramsasnamevaluearray must be passed a valid array of Name Value objects.")
2476                };
2477
2478                var strName = objParamObject.Name;
2479                var strValue = ""
2480
2481
2482                if (_ParentObject.IsObjectAnArray(objParamObject.Value) == true) {
2483                    strValue = objParamObject.Value.join(",");
2484                }
2485                else {
2486                    strValue = objParamObject.Value.toString();
2487                };
2488                strParams = strParams + "&" + encodeURIComponent(strName) + "=" + encodeURIComponent(strValue);
2489
2490            };
2491
2492
2493            var strURL = _ParentObject.GetReportViewerURL(reportname) + strParams;
2494            window.open(strURL);
2495
2496        };
2497
2498    },
2499    ViewReportWithParemetersToSetAndRecordSelection: function (reportname, paramsasnamevaluearray, recordselection) {
2500        var _ParentObject = this;
2501        var strParams = "";
2502        if (paramsasnamevaluearray != undefined) {
2503
2504            for (var indIndexParam = 0; indIndexParam < paramsasnamevaluearray.length; indIndexParam++) {
2505
2506                var objParamObject = paramsasnamevaluearray[indIndexParam];
2507                if (objParamObject.Name == undefined || objParamObject.Value == undefined) {
2508                    alert("paramsasnamevaluearray must be passed a valid array of Name Value objects.")
2509                };
2510
2511                var strName = objParamObject.Name;
2512                var strValue = ""
2513
2514
2515                if (_ParentObject.IsObjectAnArray(objParamObject.Value) == true) {
2516                    strValue = objParamObject.Value.join(",");
2517                }
2518                else {
2519                    strValue = objParamObject.Value.toString();
2520                };
2521                strParams = strParams + "&" + encodeURIComponent(strName) + "=" + encodeURIComponent(strValue);
2522
2523            };
2524
2525            var strRecordSelection = "";
2526            if (recordselection != undefined) {
2527                //%7b is {  %5d is }
2528                strRecordSelection = '&recordselection=%7b' + recordselection + '%5d';
2529            };
2530
2531            var strURL = _ParentObject.GetReportViewerURL(reportname) + strParams + strRecordSelection;
2532            window.open(strURL);
2533
2534        };
2535
2536    },
2537    GetReportParameterNameValueObject: function (name, value) {
2538
2539        var objParamObject = { Name: name, Value: value };
2540        return objParamObject;
2541
2542    },
2543
2544
2545    //Refferals
2546    RecordReferralASYNC: function (referraltype, profileid) {
2547        var _ParentObject = this;
2548        var dteNow = new Date();
2549        var strPageName = _ParentObject.GetCurrentPageNameForReferral();
2550        var strURL = _ParentObject.GetCurrentURLForReferral();
2551
2552        var objReferral = {
2553
2554            "ReferralType": referraltype,
2555            "ProfileID": profileid,
2556            "ReferralDate": dteNow,
2557            "PageName": strPageName
2558        };
2559
2560        var objPostData = {
2561            Namespace: 'Weblink_Core',
2562            TypeName: 'WC_ReferralManager',
2563            MethodName: 'AddReferralSummaryEntry',
2564            PageName: location.pathname.substring(1),
2565            obj: objReferral
2566        };
2567
2568        _ParentObject.GetGatewayResponseASYNC(objPostData);
2569    },
2570    RecordReferralFromReferralObjectASYNC: function (referralobject) {
2571        var _ParentObject = this;
2572
2573        if (referralobject.ReferralDate == undefined || referralobject.ReferralDate == "") {
2574            var dteNow = new Date();
2575            referralobject.ReferralDate = dteNow;
2576        };
2577
2578        if (referralobject.PageName == undefined || referralobject.PageName == "") {
2579            referralobject.PageName = _ParentObject.GetCurrentPageNameForReferral();
2580        };
2581        if (referralobject.URL == undefined || referralobject.URL == "") {
2582            referralobject.URL = _ParentObject.GetCurrentURLForReferral();
2583        };
2584
2585        var objPostData = {
2586            Namespace: 'Weblink_Core',
2587            TypeName: 'WC_ReferralManager',
2588            MethodName: 'AddReferralSummaryEntry',
2589            obj: referralobject
2590        };
2591
2592        _ParentObject.GetGatewayResponseASYNC(objPostData);
2593    },
2594    GetCurrentPageNameForReferral: function () {
2595        return location.pathname.substring(1);
2596    },
2597    GetCurrentURLForReferral: function () {
2598        return location.toString;
2599    },
2600
2601    //Settings
2602    ConfigSettings: [],
2603    AssocInfo: {},
2604    GetConfigSettings: function (SettingGroup) {
2605        var _ParentObject = this;
2606        var objPostData = {
2607            Namespace: 'Weblink_Core',
2608            TypeName: 'WC_ConfigSettingManager',
2609            MethodName: 'GetConfigSettingsByGroupName',
2610            GroupName: SettingGroup,
2611            Batch: "",
2612            SubBatch: ""
2613        };
2614
2615        var objData = _ParentObject.GetGatewayResponse(objPostData);
2616        _ParentObject.ConfigSettings = objData;
2617        return objData;
2618
2619    },
2620    GetConfigSettingValueFromCollection: function (SettingName, SettingsCollection) {
2621
2622        var objValue;
2623
2624        wc$.each(SettingsCollection, function (indexConfigSetting, objConfigSetting) {
2625
2626            if (objConfigSetting.SettingName.toLowerCase() == SettingName.toLowerCase()) {
2627
2628                objValue = objConfigSetting.SettingValue;
2629
2630            };
2631        });
2632
2633        return objValue;
2634    },
2635    GetConfigSettingValue: function (SettingName) {
2636        var _ParentObject = this;
2637        var objValue;
2638
2639        wc$.each(_ParentObject.ConfigSettings, function (indexConfigSetting, objConfigSetting) {
2640
2641            if (objConfigSetting.SettingName.toLowerCase() == SettingName.toLowerCase()) {
2642
2643                objValue = objConfigSetting.SettingValue;
2644
2645            };
2646        });
2647
2648        return objValue;
2649    },
2650    GetAssocInfo: function () {
2651        var _ParentObject = this;
2652        var objPostData = {
2653            Namespace: 'Weblink_Core',
2654            TypeName: 'WC_AssociationInfoManager',
2655            MethodName: 'GetAssociationInfo'
2656        };
2657
2658        var objData = _ParentObject.GetGatewayResponse(objPostData);
2659        _ParentObject.AssocInfo = objData;
2660
2661
2662        return _ParentObject.AssocInfo;
2663    },
2664    SetAssocInfo: function (object) {
2665        var _ParentObject = this;
2666        _ParentObject.AssocInfo = object;
2667    },
2668    ConsoleLogObject: function (object) {
2669        console.log(wc$.parseJSON(JSON.stringify(object)));
2670    },
2671
2672    //Common Controls
2673    AddProfileSelectorControlToContainer: function (Container, Options, SelectFunction, PlaceholderText, RestrictToOrganization, RestrictToIndividual, RestrictToActive, RestrictToMember, AndWhereClause, ShowAddress, RestrictToRelatedProfiles, RestrictToPrimaryRelations, IncludeIndividualRelatedProfileOrgName) {
2674
2675        var objProfileSelectorViewModel = kendo.observable(new WC_ProfileSelectorViewModel());
2676        var strProfileLookupLastStringSearched = "";
2677
2678        objProfileSelectorViewModel.RestrictToOrganization = RestrictToOrganization;
2679        objProfileSelectorViewModel.RestrictToIndividual = RestrictToIndividual;
2680        objProfileSelectorViewModel.RestrictToActive = RestrictToActive;
2681        objProfileSelectorViewModel.RestrictToMember = RestrictToMember;
2682        objProfileSelectorViewModel.AndWhereClause = AndWhereClause;
2683        objProfileSelectorViewModel.ShowAddress = ShowAddress;
2684        objProfileSelectorViewModel.RestrictToRelatedProfiles = RestrictToRelatedProfiles;
2685        objProfileSelectorViewModel.RestrictToPrimaryRelations = RestrictToPrimaryRelations;
2686        objProfileSelectorViewModel.IncludeIndividualRelatedProfileOrgName = IncludeIndividualRelatedProfileOrgName;
2687        //objProfileSelectorViewModel.ProfileSelectorKeywordSearchType = 1;
2688
2689        if (PlaceholderText == undefined) {
2690            PlaceholderText = "";
2691        };
2692        if (RestrictToOrganization == undefined) {
2693            RestrictToOrganization = false;
2694        };
2695        if (RestrictToIndividual == undefined) {
2696            RestrictToIndividual = false;
2697        };
2698        if (RestrictToActive == undefined) {
2699            RestrictToActive = false;
2700        };
2701        if (RestrictToMember == undefined) {
2702            RestrictToMember = false;
2703        };
2704        if (RestrictToPrimaryRelations == undefined) {
2705            RestrictToPrimaryRelations = false;
2706        };
2707        if (IncludeIndividualRelatedProfileOrgName == undefined) {
2708            IncludeIndividualRelatedProfileOrgName = false;
2709        };
2710        if (AndWhereClause == undefined) {
2711            AndWhereClause = "";
2712        };
2713        if (ShowAddress == undefined) {
2714            ShowAddress = false;
2715        };
2716        if (RestrictToRelatedProfiles == undefined) {
2717            RestrictToRelatedProfiles = false;
2718        };
2719
2720
2721        var strLookupControlID = "txtProfileLookup" + objProfileSelectorViewModel.GetRandomString();
2722
2723        var objProfileSelector = wc$('<input id="' + strLookupControlID + '" style="width: 100%" />').appendTo(Container).kendoAutoComplete({
2724            dataTextField: "ReportNameWithASF",
2725            dataValueField: "ProfileId",
2726            placeholder: PlaceholderText,
2727            filter: "contains", //"contains" was performing really slow
2728            //delay: (<%= Me.DelayInMilliseconds%> + 200), //length of time to wait before filtering starts
2729            minLength: 1, //number of characters that need to be typed before filtering starts
2730            suggest: false, //auto-selects the best match, slows performance
2731            autobind: false,
2732            height: 400,
2733            enable: true,
2734            type: "json",
2735            //serverFiltering: true,
2736            dataSource: {
2737                data: objProfileSelectorViewModel.ProfilesList,
2738                cache: false,
2739                error: function (e) {
2740                    alert(e);
2741                }
2742            },
2743            template: '<div style="overflow:hidden; border-bottom: 1px dashed \\#aaa;">'
2744                + '<div style="float: left;margin-right: 10px;">'
2745	                + '# if (OrgMember) { #<img src="/external/wcpages/images/iconOrganizationalMember.png" style="width: 19px; height : 19px; margin-top: 7px; margin-left: 11px;"/># } #'
2746	                + '# if (OrgNonMember) { #<img src="/external/wcpages/images/iconOrganizationalProfile.png" style="width: 19px; height : 19px; margin-top: 7px; margin-left: 11px;"/># } #'
2747	                + '# if (IndMember) { #<img src="/external/wcpages/images/iconIndividualMember.png" style="width: 19px; height : 19px; margin-top: 7px; margin-left: 11px;"/># } #'
2748	                + '# if (IndNonMember) { #<img src="/external/wcpages/images/iconIndividualProfile.png" style="width: 19px; height : 19px; margin-top: 7px; margin-left: 11px;"/># } #'
2749                + '</div>'
2750                + '<div style="overflow: hidden">${ReportName}&nbsp;(${ProfileId})<br />${AddressDisplay}</div>'
2751            + '</div>',
2752            animation: {
2753                open: {
2754                    effects: "fadeIn",
2755                    duration: 350,
2756                    show: true
2757                }
2758            },
2759            select: function (e) {
2760
2761                if (SelectFunction != undefined) {
2762                    SelectFunction(e);
2763                };
2764            },
2765
2766
2767        });
2768
2769        var ProfileLookupKeyUp = function (keyword) {
2770            
2771            //d = new Date();
2772            //var d_milliseconds = (d.getDate() * 43200000) + (d.getHours() * 3600000) + (d.getMinutes() * 60000) + (d.getSeconds() * 1000) + d.getMilliseconds();
2773
2774            var objLookupControl = wc$("#" + strLookupControlID).data("kendoAutoComplete");
2775
2776            //if the text being requested for the search is the same as the current value of the input box
2777            //this will pause the search for some time after the last keystroke
2778            var strInputText = objLookupControl.value();
2779            if (objProfileSelectorViewModel.Trim(keyword) == objProfileSelectorViewModel.Trim(strInputText)) {
2780
2781                if (strProfileLookupLastStringSearched == "") {
2782
2783                    //This is the first time a search is being performed
2784                    ProfileLookupDoSearch(keyword, objLookupControl);
2785
2786                }
2787                else {
2788
2789                    if (keyword.length >= strProfileLookupLastStringSearched.length) {
2790                        var strSubString = keyword.substring(0, strProfileLookupLastStringSearched.length);
2791                        if (strSubString != strProfileLookupLastStringSearched) {
2792                            //String does not start with the saved string
2793                            //Search string has changed
2794                            ProfileLookupDoSearch(keyword, objLookupControl);
2795                        }
2796
2797                        else {
2798                            //If the string.length is shorter than than the saved string.length
2799                            //Search string has been shortened
2800                            ProfileLookupDoSearch(keyword, objLookupControl);
2801                        };
2802
2803                    };
2804
2805                };
2806
2807            };
2808        }
2809
2810        var ProfileLookupDoSearch = function (keyword, objLookupControl) {
2811
2812            //do search
2813            objProfileSelectorViewModel.GetProfiles(objProfileSelectorViewModel.Trim(keyword));
2814            objLookupControl.setDataSource(objProfileSelectorViewModel.ProfilesList);
2815            //objLookupControl.dataSource.data(objProfileSelectorViewModel.ProfilesList);
2816
2817            //Save search string so it is not used again
2818            strProfileLookupLastStringSearched = keyword;
2819            objLookupControl.refresh();
2820
2821
2822
2823            //Update dropdown results
2824            objLookupControl.search(keyword);
2825            var array = objProfileSelectorViewModel.ProfilesList;
2826            if (array.length == 1) {
2827
2828                //select the only result dropdown results
2829                wc$("#" + strLookupControlID).val(objProfileSelectorViewModel.ProfilesList[0].Name);
2830
2831
2832            };
2833
2834
2835        };
2836
2837        objProfileSelector.keyup(function (objProfileSelector) {
2838
2839            var obj = wc$("#" + strLookupControlID).data("kendoAutoComplete"); //var obj = wc$("#" + strLookupControlID).data("kendoAutoComplete");
2840            var strKeyword = obj.value(); //Important:  create a new instance of the string so the autoCompleteKeyUp function doesn't get confused by referencing a property on the object.
2841            var bolIsNumeric = objProfileSelectorViewModel.IsNumeric(strKeyword);
2842            //Only perform the search if at least X characters have been entered or its numeric (profileid search)
2843
2844            if (bolIsNumeric == true) {
2845                //if this is numeric make it the a live serach each time
2846                strProfileLookupLastStringSearched = "";
2847            };
2848
2849            if (bolIsNumeric == true || strKeyword.length >= 3) {
2850                //Schedule a gateway search to be forformed in x milliseconds
2851                //If multiple searches are requested in a short period of time, we do not want multiple searches to be performed.
2852                //The autoCompleteKeyUp function will check to see that the string scheduled to be searched is still the string in the input box.
2853                //If that string has changed, the function will not execute anything
2854                setTimeout(function () { ProfileLookupKeyUp(strKeyword) }, 1000);
2855            }
2856
2857            else {
2858                //Reset saved search string
2859
2860                strProfileLookupLastStringSearched = "";
2861
2862            };
2863
2864
2865
2866        });
2867
2868        return objProfileSelector;
2869    }
2870
2871
2872});
2873

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.