///
/*
ww.jQuery.js
West Wind jQuery plug-ins and utilities
Copyright (c) 2008 Rick Strahl, West Wind Technologies
www.west-wind.com
Licensed under MIT License
http://en.wikipedia.org/wiki/MIT_License
Version 0.90.672 - 12/01/08
*/
this.HttpClient = function(opt) {
var _I = this;
this.completed = null;
this.errorHandler = null;
this.errorMessage = "";
this.async = true;
this.evalResult = false;
this.isMsAjaxJson = false;
this.contentType = "application/x-www-form-urlencoded";
this.method = "GET";
this.timeout = 20000;
this.headers = {};
$.extend(_I, opt);
this.appendHeader = function(header, value) {
_I.headers[header] = value;
}
this.send = function(url, postData, completed, errorHandler) {
completed = completed || _I.completed;
errorHandler = errorHandler || _I.errorHandler;
$.ajax(
{ url: url,
data: postData,
type: (postData ? "POST" : _I.method),
processData: false, // always process on our own!
contentType: _I.contentType,
timeout: _I.timeout,
dataType: "text",
global: false,
async: _I.async,
beforeSend: function(xhr) {
for (var header in _I.headers) xhr.setRequestHeader(header, _I.headers[header]);
},
success: function(result, status) {
var errorException = null;
if (_I.evalResult) {
try {
result = JSON.parse(result);
if (result != null) {
if (result.d && result.d.__type)
result = result.d;
else if (_I.isMsAjaxJson) {
// Wrapped message: return first property
for (var property in result) {
result = result[property];
break;
}
}
}
}
catch (e) { errorException = new CallbackException(e); }
}
if (errorException) {
if (errorHandler)
errorHandler(errorException, _I);
return;
}
if (result && (result.isCallbackError || result.iscallbackerror)) {
if (errorHandler)
errorHandler(result, _I);
}
if (completed)
completed(result, _I);
},
error: function(xhr, status) {
var res = xhr.responseText;
var err = null;
if (res && res.charAt(0) == '{')
var err = JSON.parse(res);
if (!err) {
if (xhr.status != 200)
err = new CallbackException(xhr.status + " " + xhr.statusText);
else
err = new CallbackException("Unknown Error Response");
err.detail = res;
}
else
err = new CallbackException(err); // force error to common format
if (errorHandler)
errorHandler(err, _I, xhr);
}
});
}
this.returnError = function(message) {
var error = new CallbackException(message);
if (_I.errorHandler)
_I.errorHandler(error, _I);
}
}
this.ServiceProxy = function(serviceUrl) {
///
/// Generic Service Proxy class that can be used to
/// call JSON Services generically using jQuery
///
/// The Url of the service ready to accept the method name
///
/// var proxy = new ServiceProxy("JsonStockService.svc/");
/// proxy.invoke("GetStockQuote",{symbol:"msft"},function(quote) { alert(result.LastPrice); },onPageError);
///
var _I = this;
this.serviceUrl = serviceUrl;
// Call a wrapped object
this.invoke = function(method, params, callback, errorCallback, isBare) {
///
/// Calls a WCF/ASMX service and returns the result.
///
/// The method of the service to call
/// An object that represents the parameters to pass {symbol:"msft",years:2}
/// Function called on success. Receives a single parameter of the parsed result value
/// Function called on failure. Receives a single error object with Message and StackDetail
/// Set to true if response is not a WCF/ASMX style wrapped object
// Convert input data into JSON using internal code
var json = JSON.serialize(params);
// The service endpoint URL MyService.svc/
var url = _I.serviceUrl + method;
var http = new HttpClient(
{ contentType: "application/json",
evalResult: true,
isMsAjaxJson: !isBare
});
http.send(url, json, callback, errorCallback);
}
}
this.AjaxMethodCallback = function(controlId, url, opt) {
var _I = this;
this.controlId = controlId;
this.postbackMode = "PostMethodParametersOnly"; // Post,PostNoViewState,Get
this.serverUrl = url;
this.formName = null;
this.resultMode = "json"; // json,msajax,string
this.completed = null;
this.errorHandler = null;
$.extend(this, opt);
this.Http = null;
this.callMethod = function(methodName, parameters, callback, errorCallback) {
_I.completed = callback;
_I.errorHandler = errorCallback;
http = new HttpClient(); _I.Http = http;
http.evalResult = true;
var data = {};
if (_I.resultMode == "msajax"){
http.isMsAjax = true;
data = JSON.serialize(parameters);
}
else {
var parmCount = 0;
if (parameters.length) {
parmCount = parameters.length;
for (var x = 0; x < parmCount; x++) {
data["Parm" + (x + 1).toString()] = JSON.serialize(parameters[x]);
}
}
$.extend(data, { CallbackMethod: methodName,
CallbackParmCount: parmCount,
__WWEVENTCALLBACK: _I.controlId
});
data = $.param(data) + "&"
}
var formName = _I.formName || document.forms[0];
if (_I.postbackMode == "Post")
data += $("#" + formName).serialize();
else if (_I.postbackMode == "PostNoViewstate")
data += $().serializeNoViewState();
else if (this.postbackMode == "Get") {
Url = this.serverUrl;
if (Url.indexOf('?') > -1)
Url += data;
else
Url += "?" + data;
return http.send(Url, null, _I.onHttpCallback, _I.onHttpCallback);
}
return http.send(this.serverUrl, data, _I.onHttpCallback, _I.onHttpCallback);
}
this.onHttpCallback = function(result) {
if (result && result.isCallbackError || result.iscallbackerror) {
if (_I.errorHandler)
_I.errorHandler(result, _I);
return;
}
if (_I.completed != null)
_I.completed(result, _I);
}
}
ajaxJson = function(url, parm, callback, errorCallback, options) {
var ser = parm;
var opt = { method: "POST", contentType: "application/json", noPostEncoding: false };
$.extend(opt,options);
var http = new HttpClient(opt);
http.evalResult = true;
if (!opt.noPostEncoding && opt.method == "POST")
ser = JSON.serialize(parm);
http.send(url, ser, callback, errorCallback);
}
ajaxCallMethod = function(url,method,parms,callback,errorCallback,options)
{
var proxy = new AjaxMethodCallback(null,url,options);
proxy.callMethod(method,parms,callback,errorCallback);
}
this.CallbackException = function(message, detail) {
this.isCallbackError = true;
if (typeof (message) == "object") {
if (message.message)
this.message = message.message;
else if (message.Message)
this.message = message.Message;
}
else
this.message = message;
if (detail)
this.detail = detail;
else
this.detail = null;
}
//Copyright (c) 2005 JSON.org
//Modifications for MS AJAX by Rick Strahl
//Added dates in object parser,} and ] encoding, MS Date Support
this.JSON = {
copyright: '(c)2005 JSON.org',
license: 'http://www.crockford.com/JSON/license.html',
serialize: function(v) {
var a = [];
// Emit a string.
function e(s) {
a[a.length] = s;
}
// Convert a value.
function g(x) {
var b, c, i, l, v;
switch (typeof x) {
case 'string':
e('"');
if (/["\\\x00-\x1f\x7d\x5d]/.test(x)) {
l = x.length;
for (i = 0; i < l; i += 1) {
c = x.charAt(i);
if (c >= ' ' && c != '}' && c != ']') {
if (c == '\\' || c == '"')
e('\\');
e(c);
} else {
switch (c) {
case '\b':
e('\\b');
break;
case '\f':
e('\\f');
break;
case '\n':
e('\\n');
break;
case '\r':
e('\\r');
break;
case '\t':
e('\\t');
break;
case '}':
e('\\u007D');
break;
case ']':
e('\\u005D');
break;
default:
c = c.charCodeAt();
e('\\u00' +
Math.floor(c / 16).toString(16) +
(c % 16).toString(16));
}
}
}
} else {
e(x);
}
e('"');
return;
case 'number':
e(isFinite(x) ? x : 'null');
return;
case 'object':
if (x) {
// RAS: Added Date Parsing
if (x.toUTCString)
return e('\"\\/Date(' + x.getTime() + ')\\/\"'); // MS Ajax style
if (x instanceof Array) {
e('[');
l = a.length;
for (i = 0; i < x.length; i += 1) {
v = x[i];
if (typeof v != _ud &&
typeof v != 'function') {
if (b) {
e(',');
}
g(v);
b = true;
}
}
e(']');
return;
} else if (typeof x.valueOf == 'function') {
e('{');
l = a.length;
for (i in x) {
v = x[i];
if (typeof v != _ud &&
typeof v != 'function' &&
(!v || typeof v != 'object' ||
typeof v.valueOf == 'function')) {
if (b) {
e(',');
}
g(i);
e(':');
g(v);
b = true;
}
}
return e('}');
}
}
e('null');
return;
case 'boolean':
e(x);
return;
default:
e('null');
return;
}
}
g(v);
return a.join('');
},
// *** RAS Update: RegEx handler for dates ISO and MS AJAX style
regExDate: function(str, p1, p2, offset, s) {
str = str.substring(1).replace('"', '');
var date = str;
//MS Ajax date
var regEx = /\/Date(.*)\//;
if (regEx.test(str)) {
str = str.match(/Date\((.*?)\)/)[1];
date = "new Date(" + parseInt(str) + ")";
}
else { // ISO Date 2007-12-31T23:59:59Z
var matches = str.split(/[-,:,T,Z]/);
matches[1] = (parseInt(matches[1], 0) - 1).toString();
date = "new Date(Date.UTC(" + matches.join(",") + "))";
}
return date;
},
parse: function(text, noCheck) {
if (!noCheck && !(!(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, '')))))
throw new Error("Invalid characters in JSON parse string.");
// *** RAS Update: Fix up Dates: ISO and MS AJAX format support
var regEx = /(\"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}.*?\")|(\"\\*\/Date\(.*?\)\\*\/")/g;
//var regEx = /(\"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}.*?\")|(\"\\\/Date\(.*?\)\\\/")/g;
text = text.replace(regEx, this.regExDate);
return eval('(' + text + ')');
},
parseSafe: function(text) {
try { return this.parse(text); } catch (e) { return null; }
}
}
this.StatusBar = function(sel, opt) {
var _I = this;
var _sb = null;
// options
this.elementId = "_showstatus";
this.prependMultiline = true;
this.showCloseButton = false;
this.afterTimeoutText = null;
this.cssClass = "statusbar";
this.highlightClass = "statusbarhighlight";
this.closeButtonClass = "statusbarclose";
this.additive = false;
$.extend(this, opt);
if (sel)
_sb = $(sel);
// create statusbar object manually
if (!_sb) {
_sb = $("
" +
"
" +
(_I.showCloseButton ? " X
" : ""))
.appendTo(document.body)
.show();
}
if (_I.showCloseButton)
$("." + _I.cssClass).click(function(e) { $(_sb).hide(); });
this.show = function(message, timeout, isError, additive) {
if (_I.additive) {
var html = $("
" + message + "
");
if (_I.prependMultiline)
_sb.prepend(html);
else
_sb.append(html);
}
else {
if (!_I.showCloseButton)
_sb.text(message);
else {
var t = _sb.find("div.statusbarclose");
_sb.text(message).prepend(t);
}
}
_sb.show();
if (timeout) {
if (isError)
_sb.addClass(_I.errorClass);
else
_sb.addClass(_I.highlightClass);
setTimeout(
function() {
_sb.removeClass(_I.highlightClass);
if (_I.afterTimeoutText)
_I.show(_I.afterTimeoutText);
},
timeout);
}
}
this.hide = function() {
_sb.hide();
}
this.release = function() {
if (_statusbar)
$(_statusbar).remove();
}
}
// use this as a global instance to customize constructor
// or do nothing and get a default status bar
var __statusbar = null;
this.showStatus = function(message, timeout, isHighlighted, additive) {
if (!__statusbar)
if(typeof message == "object") {
__statusbar = new StatusBar(null, message);
return;
}
else
__statusbar = new StatusBar();
__statusbar.show(message, timeout, isHighlighted, additive);
}
$.fn.centerInClient = function(options) {
/// Centers the selected items in the browser window. Takes into account scroll position.
/// Ideally the selected set should only match a single element.
///
/// Optional function called when centering is complete. Passed DOM element as parameter
/// if true forces the element to be removed from the document flow
/// and attached to the body element to ensure proper absolute positioning.
/// Be aware that this may cause ID hierachy for CSS styles to be affected.
///
///
var opt = { forceAbsolute: false,
container: window, // selector of element to center in
completed: null
};
$.extend(opt, options);
return this.each(function(i) {
var el = $(this);
var jWin = $(opt.container);
var isWin = opt.container == window;
// force to the top of document to ENSURE that
// document absolute positioning is available
if (opt.forceAbsolute) {
if (isWin)
el.remove().appendTo("body");
else
el.remove().appendTo(jWin.get(0));
}
// have to make absolute
el.css("position", "absolute");
// height is off a bit so fudge it
var heightFudge = 2.2;
var x = (isWin ? jWin.width() : jWin.outerWidth()) / 2 - el.outerWidth() / 2;
var y = (isWin ? jWin.height() : jWin.outerHeight()) / heightFudge - el.outerHeight() / 2;
el.css({ left: x + jWin.scrollLeft(), top: y + jWin.scrollTop() });
var zi = el.css("zIndex");
if (!zi || zi == "auto")
el.css("zIndex", 1);
// if specified make callback and pass element
if (opt.completed)
opt.completed(this);
});
}
$.fn.moveToMousePosition = function(evt, options) {
var opt = { left: 0,top: 0 };
$.extend(opt, options);
return this.each(function() {
var el = $(this);
el.css({ left: evt.pageX + opt.left,
top: evt.pageY + opt.top,
position: "absolute"
});
});
}
$.fn.shadow = function(action, options, refreshOnly) {
///
/// Applies a drop shadow to an element by
/// underlaying a
underneath the element(s)
///
/// Note the shadow is not locked to the element
/// so if the element is moved the shadow needs
/// to be reapplied.
///
///
/// optional - hide, remove
/// can also be the options parameter if action is omitted
///
///
/// optional parameters.
/// offset: 6,
/// color: "black",
/// opacity: .25,
/// callback: null,
/// zIndex: 100,
///
///
if (typeof action == "object")
options = action;
var opt = { offset: 6,
color: "black",
opacity: 0.25,
callback: null,
zIndex: 100
};
$.extend(opt, options);
this.each(function() {
var el = $(this);
var sh = $("#" + el.get(0).id + "Shadow");
if (typeof action == "string") {
if (action=="hide" || action=="remove") {
el.unwatch("_shadowMove");
sh.remove();
}
return;
}
var exists = true;
if (sh.length < 1) {
sh = $("")
.attr("id",el.get(0).id + "Shadow")
.insertAfter(el);
var zi = el.css("zIndex");
if (!zi || zi == "auto") {
el.css("zIndex", opt.zIndex);
sh.css("zIndex", opt.zIndex - 1);
}
var shEl = sh.get(0);
if (typeof shEl.style.filter == "string") {
shEl.style.filter = 'progid:DXImageTransform.Microsoft.Blur(makeShadow=1, shadowOpacity=' + opt.opacity.toString() + ', pixelRadius=3)';
opt.offset = opt.offset - 4;
}
exists = false;
}
el.css("position","absolute");
var vis = el.is(":visible");
if (!vis)
el.show(); // must be visible to get .position
var pos = el.position();
sh.show()
.css({ position: "absolute",
width: el.outerWidth(),
height: el.outerHeight(),
opacity: opt.opacity,
background: opt.color,
left: pos.left + opt.offset,
top: pos.top + opt.offset
})
.css("-moz-border-radius", "0px 1px 2px 1px")
.css("-webkit-border-radius", "3px");
if (!vis) {
el.hide();
sh.hide();
}
zIndex = el.css("zIndex");
if (zIndex && zIndex != "auto")
sh.css("zIndex", zIndex - 1);
else{
el.css("zIndex", opt.zIndex); sh.css("zIndex",opt.zIndex-1);
}
if (!exists) {
el.watch("left,top,width,height,display,opacity,zIndex",
function(w, i) {
if (el.is(":visible")) {
$(this).shadow(opt);
sh.css("opacity", el.css("opacity") * opt.opacity);
}
else
sh.hide();
},
100, "_shadowMove");
}
if (opt.callback)
opt.callback(sh);
});
return this;
}
$.fn.tooltip = function(msg, timeout, options) {
var opt = { cssClass: "",
isHtml: false,
shadowOffset: 2,
onRelease: null
};
$.extend(opt, options);
return this.each(function() {
var tp = new _ToolTip(this, opt);
if (msg == "hide") {
tp.hide();
return;
}
tp.show(msg, timeout, opt.isHtml);
});
function _ToolTip(sel, opt) {
var _I = this;
var jEl = $(sel);
this.cssClass = "";
this.onRelease = null;
$.extend(_I, opt);
var el = jEl.get(0);
var tt = $("#" + el.id + "_tt");
this.show = function(msg, timeout, isHtml) {
if (tt.length > 0)
tt.remove();
tt = $("").attr("id",el.id + "_tt");
$(document.body).append(tt);
tt.css({
position: "absolute",
display: "none",
zIndex: 1000
});
if (_I.cssClass)
tt.addClass(_I.cssClass);
else
tt.css({
background: "cornsilk",
border: "solid 1px gray",
fontSize: "0.80em",
padding: 2
});
if (isHtml)
tt.html(msg);
else
tt.text(msg);
var pos = jEl.position();
var Left = pos.left + 5;
var Top = pos.top + jEl.height() - 2;
var Width = tt.width();
if (Width > 400)
Width = 400;
tt.css({ left: Left,
top: Top,
width: Width
});
tt.show();
tt.shadow({ offset: opt.shadowOffset });
if (timeout && timeout > 0)
setTimeout(function() {
if (_I.onRelease)
_I.onRelease.call(el,_I);
_I.hide();
}, timeout);
}
this.hide = function() {
if (tt.length > 0)
tt.fadeOut("slow", function() { tt.shadow("hide") } );
}
}
}
$.fn.watch = function(props, func, interval, id) {
///
/// Allows you to monitor changes in a specific
/// CSS property of an element by polling the value.
/// when the value changes a function is called.
/// The function called is called in the context
/// of the selected element (ie. this)
///
/// CSS Properties to watch sep. by commas
///
/// Function called when the value has changed.
///
///
/// Optional interval for browsers that don't support DOMAttrModified or propertychange events.
/// Determines the interval used for setInterval calls.
///
/// A unique ID that identifies this watch instance on this element
///
if (!interval)
interval = 200;
if (!id)
id = "_watcher";
return this.each(function() {
var _t = this;
var el = $(this);
var fnc = function() { __watcher.call(_t, id) };
var itId = null;
if (typeof (this.onpropertychange) == "object")
el.bind("propertychange." + id, fnc);
else if ($.browser.mozilla)
el.bind("DOMAttrModified." + id, fnc);
else
itId = setInterval(fnc, interval);
var data = { id: itId,
props: props.split(","),
func: func,
vals: [props.split(",").length]
};
$.each(data.vals, function(i) { data.vals[i] = el.css(data.props[i]); });
el.data(id, data);
});
function __watcher(id) {
var el = $(this);
var w = el.data(id);
var changed = false;
var i = 0;
for (i; i < w.props.length; i++) {
var newVal = el.css(w.props[i]);
if (w.vals[i] != newVal) {
w.vals[i] = newVal;
changed = true;
break;
}
}
if (changed && w.func) {
var _t = this;
w.func.call(_t, w, i)
}
}
}
$.fn.unwatch = function(id) {
this.each(function() {
var w = $(this).data(id);
var el = $(this);
el.removeData();
try {
if (typeof (this.onpropertychange) == "object")
el.unbind("propertychange." + id, fnc);
else if ($.browser.mozilla)
el.unbind("DOMAttrModified." + id, fnc);
else
clearInterval(w.id);
}
// ignore if element was already unbound
catch(e){}
});
return this;
}
$.fn.listSetData = function(items, options) {
var opt = { noClear: false, // don't clear the list first if true
dataValueField: null, // optional value field for object lists
dataTextField: null
};
$.extend(opt, options);
return this.each(function() {
var el = $(this);
if (items == null) {
el.children().remove();
return;
}
if (!opt.noClear)
el.children().remove();
if (items.Rows)
items = items.Rows;
var IsValueList = false;
if (!opt.dataTextField && !opt.dataValueField)
IsValueList = true;
for (x = 0; x < items.length; x++) {
var row = items[x];
if (IsValueList)
el.listAddItem(row, row);
else
el.listAddItem(row[opt.dataTextField], row[opt.dataValueField]);
}
});
}
$.fn.listAddItem = function(text, value) {
return this.each(function() {
$(this).append( $("").attr("value",value).text(text) );
});
}
$.fn.listSelectItem = function(value) {
if (!this.options)
return;
for (var x = this.options.length - 1; x > -1; x--) {
if (this.options[x].value == value) {
this.options[x].selected = true;
return;
}
}
}
this.HoverPanel = function(sel, opt) {
var _I = this;
var jEl = $(sel);
var el = jEl.get(0);
var busy = -1;
var lastMouseTop = 0;
var lastMouseLeft = 0;
this.serverUrl = "";
this.controlId = el.id;
this.htmlTargetId = el.id;
this.queryString = "";
this.eventHandlerMode = "ShowHtmlAtMousePosition";
this.postbackMode = "Get"; // Post/PostNoViewState
this.completed = null;
this.errorHandler = null;
this.hoverOffsetRight = 0;
this.hoverOffsetBottom = 0;
this.panelOpacity = 1;
this.shadowOffset = 0;
this.shadowOpacity = 0.25;
this.adjustWindowPosition = true;
this.formName = "";
this.navigateDelay = 0;
this.http = null;
$.extend(_I, opt);
this.startCallback = function(e, queryString, postData, errorHandler) {
try {
var key = new Date().getTime();
_I.busy = key;
var Url = this.serverUrl;
if (e) {
_I.lastMouseTop = e.clientY;
_I.lastMouseLeft = e.clientX;
}
else
_I.lastMouseTop = 0;
if (queryString == null)
_I.queryString = queryString = "";
else
_I.queryString = queryString;
if (errorHandler)
_I.errorHandler = errorHandler;
if (queryString)
queryString += "&";
else
queryString = "";
queryString += "__WWEVENTCALLBACK=" + _I.controlId;
_I.formName = _I.formName || document.forms[0];
_I.http = new HttpClient();
_I.http.appendHeader("RequestKey", key);
if(postData)
postData += "&";
else
postData = "";
if (_I.postbackMode == "Post")
postData += $(_I.formName).serialize();
else if (this.postbackMode == "PostNoViewstate")
postData += $(_I.formName).serializeNoViewState();
else if (this.postbackMode == "Get" && postData)
queryString += postData;
if (queryString != "") {
if (Url.indexOf("?") > -1)
Url = Url + "&" + queryString
else
Url = Url + "?" + queryString;
}
if (_I.eventHandlerMode == 'ShowIFrameAtMousePosition' ||
_I.eventHandlerMode == 'ShowIFrameInPanel') {
setTimeout(function() { if (_I.busy) _I.showIFrame.call(_I, Url); }, _I.navigateDelay);
return;
}
// *** Send the request with navigate delay
setTimeout(function() {
if (_I.busy == key)
_I.http.send.call(_I, Url, postData, _I.onHttpCallback, _I.onHttpCallback);
}, _I.navigateDelay);
}
catch (e) {
// *** Call with 'error message'
_I.onHttpCallback(new CallbackException(e.message));
}
}
this.onHttpCallback = function(result) {
_I.busy = -1;
if (_I.http && _I.http.status && _I.http.status != 200)
result = new CallbackException(http.statusText);
if (result == null)
result = new CallbackException("No output was returned.");
if (result.isCallbackError) {
if (_I.errorHandler)
_I.errorHandler(result);
return;
}
_I.displayResult(result);
}
this.displayResult = function(result) {
if (_I.completed && _I.completed(Result, _I) == false)
return;
if (_I.eventHandlerMode == "ShowHtmlAtMousePosition") {
_I.assignContent(result);
_I.movePanelToPosition(_I.lastMouseLeft + _I.hoverOffsetRight, _I.lastMouseTop + _I.hoverOffsetBottom);
_I.show();
}
else if (_I.eventHandlerMode == "ShowHtmlInPanel") {
_I.assignContent(result);
_I.show();
}
}
this.assignContent = function(result) {
$("#" + _I.htmlTargetId).html(result);
}
this.movePanelToPosition = function(x, y) {
try {
jEl.css("position", "absolute");
if (typeof x == "object") {
_I.lastMouseTop = x.clientY;
_I.lastMouseLeft = x.clientX;
}
else if (typeof x == "number") {
_I.lastMouseTop = y;
_I.lastMouseLeft = x;
}
var x = _I.lastMouseLeft + 3;
var y = _I.lastMouseTop + 3;
var jWin = $(window);
jEl.css({ left: x + jWin.scrollLeft(), top: y + jWin.scrollTop() });
if (_I.adjustWindowPosition && document.body) {
var mainHeight = jWin.height();
var panHeight = jEl.outerHeight();
var mainWidth = jWin.width();
var panWidth = jEl.outerWidth();
if (mainHeight < panHeight)
y = 0;
else {
if (mainHeight < _I.lastMouseTop + panHeight)
y = mainHeight - panHeight - 10;
}
if (mainWidth < panWidth)
x = 0;
else {
if (mainWidth < _I.lastMouseLeft + panWidth)
x = mainWidth - panWidth - 25;
}
jEl.css({ left: x + jWin.scrollLeft(), top: y + jWin.scrollTop() });
}
}
catch (e)
{ window.status = 'Moving off window failed: ' + e.message; }
}
this.showIFrame = function(Url) {
_I.busy = false;
Url = Url ? Url : _I.serverUrl;
$w(_I.controlId + '_IFrame').src = Url;
if (_I.eventHandlerMode == "ShowIFrameAtMousePosition") {
_I.show();
_I.movePanelToPosition(_I.lastMouseLeft + _I.hoverOffsetRight, _I.lastMouseTop + _I.hoverOffsetBottom);
}
else
_I.show();
}
this.hide = function() {
this.abort();
jEl.hide();
}
this.abort = function() { _I.busy = -1; }
this.show = function() {
jEl.show().css("opacity", _I.panelOpacity);
if (_I.shadowOffset)
jEl.shadow({ offset: _I.shadowOffset, opacity: _I.shadowOpacity });
}
}
function _ModalDialog(sel, opt) {
var _I = this;
var jEl = $(sel);
if (jEl.length < 1)
jEl = $("#" + sel);
if (jEl.length < 1)
return;
this.overlayId = "_ModalOverlay";
this.contentId = jEl.get(0).id;
this.headerId = "";
this.backgroundOpacity = .75;
this.fadeInBackground=false;
this.zIndex = 10000;
this.jOverlay = null;
this.keepCentered = true;
this.dialogHandler = null;
$.extend(_I, opt);
var hideLists = null;
this.show = function(msg, head, asHtml) {
if (_I.contentId && typeof msg == "string")
!asHtml ? $("#" + _I.contentId).text(msg) : $("#" + _I.contentId).html(msg);
if (_I.headerId && typeof head == "string")
!asHtml ? $("#" + _I.headerId).text(head) : $("#" + _I.headerId).html(head);
jEl.css({ zIndex: _I.zIndex + 2 }).show().centerInClient();
var bg = opaqueOverlay({ zIndex: _I.zIndex + 1, sel: "#" + _I.overlayId });
_I.zIndex++;
if (_I.fadeInBackground)
bg.hide().fadeIn("slow");
// *** track any clicks inside modal dialog
jEl.click(_I.callback);
if (_I.keepCentered)
$(window).bind("resize.modal", function() { jEl.centerInClient() })
.bind("scroll.modal", function() { jEl.centerInClient() });
// hide visible IE listboxes and store
if ($.browser.msie && $.browser.version < "7" )
hideLists = $("select:visible").not($(jEl).find("select")).hide();
}
this.hide = function() {
jEl.hide();
if (_I.keepCentered)
$(window).unbind("resize.modal")
.unbind("scroll.modal");
opaqueOverlay("hide",{ sel: "#" + _I.overlayId} );
jEl.unbind("click");
// restore IE list boxes
if (hideLists) {
hideLists.show(); hideLists=null;
}
}
this.genericDialog = function(msg,header,isHtml,handler)
{
var dl = $("#_MBOX");
if (dl.length < 1) {
var dl = $("").addClass("blackBorder dragwindow").attr("id","_MBOX").css({width: 400 });
var head = $("").addClass("gridheader").attr("id","_MBOXHEADER");
var ctn = $("").addClass("containercontent").attr("id","_MBOXCONTENT");
dl.append(head).append(ctn).appendTo(document.body);
}
dl.modalDialog( { dialogHandler: handler, headerId: "_MBOXHEADER", contentId: "_MBOXCONTENT" },
msg, header, isHtml)
.draggable().shadow()
.closable( {closeHandler: handler || function() { dl.modalDialog("hide"); }});
}
this.callback = function(e) {
if (_I.dialogHandler) {
var btn = (e.target == $("#" + _I.okButtonId).get(0)) ? 1 : 0;
if (_I.dialogHandler.call(e.target, e, btn) == false)
return;
setTimeout(function() { _I.hide(); }, 10);
return;
}
// by default close window when clicking a button or link
if ($(e.target).is(":button,a,img"))
setTimeout(function() { _I.hide(); }, 10);
}
}
$.fn.modalDialog = function(opt, msg, head, asHtml, handler) {
if (this.length < 1)
return this;
// only works with a single instance
var el = this.get(0);
var jEl = $(el);
var dId = "modal" + el.id;
var md = jEl.data(dId);
if (!md)
md = new _ModalDialog(jEl, opt);
if (typeof opt == "string") {
if (opt == "hide" || opt=="close")
md.hide();
if (opt == "instance" || opt == "get")
return md;
if (opt == "generic")
md.genericDialog(msg,head,asHtml,handler);
return;
}
md.show(msg, head, asHtml);
jEl.data(dId, md);
return this;
}
this.opaqueOverlay = function(opt,p2) {
var _I = this;
var jWin = $(window);
this.sel = "#_ShadowOverlay";
this.opacity = 0.75;
this.zIndex = 10000;
$.extend(this, p2 || opt);
var sh = $(sel);
if (opt == "hide") {
if (sh.length < 1)
return;
sh.hide();
sh.get(0).opaqueOverlay = false;
jWin.unbind("resize.opaque").unbind("scroll.opaque");
return;
}
if (sh.length < 1)
sh = $("")
.attr("id", this.sel.substr(1))
.css("background", "black")
.appendTo(document.body);
var el = sh.get(0);
sh.show();
if (!el.opaqueOverlay)
jWin.bind("resize.opaque", function() { opaqueOverlay(opt); })
.bind("scroll.opaque", function() { opaqueOverlay(opt); });
el.opaqueOverlay = true;
sh.css({ top: 0 + jWin.scrollTop(), left: 0 + jWin.scrollLeft(), position: "absolute", opacity: _I.opacity, zIndex: _I.zIndex })
.width(jWin.width())
.height(jWin.height());
return sh;
}
if (!$.fn.draggable) {
$.fn.draggable = function(opt) {
return this.each(function() {
var el = $(this);
var drag = el.data("draggable");
if (typeof opt == "string") {
if (drag && opt == "remove") {
drag.stopDragging();
el.removeData("draggable");
}
return;
}
if (!drag) {
drag = new DragBehavior(this, opt);
el.data("draggable", drag);
}
});
}
var __dragIndex = 1;
function DragBehavior(sel, opt) {
var _I = this;
var el = $(sel);
this.handle = "";
this.opacity = 0.75;
this.start = null;
this.stop = null;
this.dragDelay = 100;
this.forceAbsolute = false;
$.extend(_I, opt);
_I.handle = _I.handle ? $(_I.handle) : el;
if (_I.handle.length < 1)
_I.handle = el;
var isMouseDown = false;
var isDrag = false;
var timeMD = 0;
var clicked = -1;
var deltaX = 0;
var deltaY = 0;
var savedOpacity = 1;
var savedzIndex = 0;
this.mouseDown = function(e) {
var dEl = _I.handle.get(0);
var s = false;
$(e.target).parents().each(function() { if (this == dEl) s = true; });
if (isMouseDown || (e.target != dEl && !s ) || $(e.target).is(".closebox,input,textara,a"))
return;
isMouseDown = true;
isDrag = false;
var pos = _I.handle.offset();
deltaX = e.pageX - pos.left;
deltaY = e.pageY - pos.top;
setTimeout(function() {
if (!isMouseDown) return;
el.show().makeAbsolute(_I.forceAbsolute);
_I.dragActivate(e);
}, _I.dragDelay);
}
var nf = function(e) { e.stopPropagation(); };
this.dragActivate = function(e) {
if (!isMouseDown) return;
isDrag = true;
_I.moveToMouse(e);
isMouseDown = true;
savedzIndex = el.css("zIndex");
el.css("zIndex", 150000);
savedOpacity = el.css("opacity");
el.css({ opacity: _I.opacity, cursor: "move" });
$(document).bind("mousemove.dbh",_I.mouseMove);
$(document.body).bind("selectstart.dbh",nf);
$(document.body).bind("dragstart.dbh",nf);
$(document.body).bind("selectstart.dbh",nf);
_I.handle.bind("selectstart.dbh",nf);
if (_I.start)
_I.start(e, _I);
}
this.dragDeactivate = function(e, noMove) {
if (!isMouseDown) return;
isMouseDown = false;
if (!isDrag) return;
isDrag = false;
if (!noMove)
_I.moveToMouse(e);
$(document).unbind("mousemove.dbh");
$(document).unbind("selectstart.dbh");
$(document.body).unbind("dragstart.dbh");
$(document.body).unbind("selectstart.dbh");
_I.handle.unbind("selectstart.dbh");
if (!noMove) {
__dragIndex += 10;
el.css({ zIndex: 10000 + __dragIndex, cursor: "auto" });
el.css("opacity", savedOpacity);
if (_I.stop)
_I.stop(e, _I);
}
}
this.mouseUp = function(e) {
_I.dragDeactivate(e);
}
this.mouseMove = function(e) {
if (isMouseDown)
_I.moveToMouse(e);
}
this.moveToMouse = function(e) {
el.css({ left: e.pageX - deltaX, top: e.pageY - deltaY });
}
this.stopDragging = function() {
if (!isDrag) return;
_I.dragDeactivate(null, true);
$(document).unbind("mousedown", _I.mouseDown);
}
$(document).mousedown(_I.mouseDown);
$(document).mouseup(_I.mouseUp);
}
}
$.fn.closable = function(options) {
var opt = { handle: null,
closeHandler: null,
cssClass: "closebox"
};
$.extend(opt, options);
return this.each(function(i) {
var el = $(this);
var pos = el.css("position");
if (!pos || pos == "static")
el.css("position", "relative");
var h = opt.handle ? $(opt.handle) : el;
var div = $("").addClass(opt.cssClass)
.click(function() {
if (opt.closeHandler)
if (!opt.closeHandler.call(this))
return;
$(el).hide();
});
h.append(div);
});
}
///
///
/// var tmpl = $("#itemtemplate").html();
/// var data = { content: "This is some textual content",
/// names: ["rick", "markus"]
/// };
/// $(document.body).html(parseTemplate(tmpl, data));
/// based on John Resig's Micro Templating engine
var _tmplCache = {}
this.parseTemplate = function(str, data) {
///
/// Client side template parser that uses <#= #> and <# code #> expressions.
/// and # # code blocks for template expansion.
///
/// The text of the template to expand
///
/// Any data that is to be merged. Pass an object and
/// that object's properties are visible as variables.
///
///
var err = "";
try {
var func = _tmplCache[str];
if (!func) {
var strFunc =
"var p=[],print=function(){p.push.apply(p,arguments);};" +
"with(obj){p.push('" +
str.replace(/[\r\t\n]/g, " ")
.replace(/'(?=[^#]*#>)/g, "\t")
.split("'").join("\\'")
.split("\t").join("'")
.replace(/<#=(.+?)#>/g, "',$1,'")
.split("<#").join("');")
.split("#>").join("p.push('")
+ "');}return p.join('');";
//alert(strFunc);
func = new Function("obj", strFunc);
_tmplCache[str] = func;
}
return func(data);
} catch (e) { err = e.message; }
return "< # ERROR: " + err.htmlEncode() + " # >";
}
String.prototype.htmlEncode = function() {
var div = document.createElement('div');
if (typeof (div.textContent) == 'string')
div.textContent = this.toString();
else
div.innerText = this.toString();
return div.innerHTML;
}
String.prototype.trimEnd = function(c) {
return this.replace(/\s+$/, '');
}
String.prototype.trimStart = function(c) {
return this.replace(/^\s+/, '');
}
String.repeat = function(chr, count) {
var str = "";
for (var x = 0; x < count; x++) { str += chr };
return str;
}
String.prototype.padL = function(width, pad) {
if (!width || width < 1)
return this;
if (!pad) pad = " ";
var length = width - this.length
if (length < 1) return this.substr(0, width);
return (String.repeat(pad, length) + this).substr(0, width);
}
String.prototype.padR = function(width, pad) {
if (!width || width < 1)
return this;
if (!pad) pad = " ";
var length = width - this.length
if (length < 1) this.substr(0, width);
return (this + String.repeat(pad, length)).substr(0, width);
}
String.startsWith = function(str) {
if (!str) return false;
return this.substr(0, str.length) == str;
}
String.format = function(frmt, args) {
for (var x = 0; x < arguments.length; x++) {
frmt = frmt.replace("{" + x + "}", arguments[x + 1]);
}
return frmt;
}
String.prototype.format = function() {
var a = [this];
$.merge(a, arguments);
return String.format.apply(this, a);
}
String.prototype.isNumber = function() {
if (this.length == 0) return false;
if ("0123456789".indexOf(this.substr(0,1)) > -1)
return true;
return false;
}
var _monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
Date.prototype.formatDate = function(format) {
var date = this;
if (!format)
format = "MM/dd/yyyy";
var month = date.getMonth();
var year = date.getFullYear();
if (format.indexOf("yyyy") > -1)
format = format.replace("yyyy", year.toString());
else if (format.indexOf("yy") > -1)
format = format.replace("yy", year.toString().substr(2, 2));
format = format.replace("dd", date.getDate().toString().padL(2, "0"));
var hours = date.getHours();
if (format.indexOf("t") > -1) {
if (hours > 11)
format = format.replace("t", "pm")
else
format = format.replace("t", "am")
}
if (format.indexOf("HH") > -1)
format = format.replace("HH", hours.toString().padL(2, "0"));
if (format.indexOf("hh") > -1) {
if (hours > 12) hours -= 12;
if (hours == 0) hours = 12;
format = format.replace("hh", hours.toString().padL(2, "0"));
}
if (format.indexOf("mm") > -1)
format = format.replace("mm", date.getMinutes().toString().padL(2, "0"));
if (format.indexOf("ss") > -1)
format = format.replace("ss", date.getSeconds().toString().padL(2, "0"));
if (format.indexOf("MMMM") > -1)
format = format.replace("MMMM", _monthNames[month]);
else if (format.indexOf("MMM") > -1)
format = format.replace("MMM", _monthNames[month].substr(0, 3));
else
format = format.replace("MM", (month + 1).toString().padL(2, "0"));
return format;
}
Number.prototype.formatNumber = function(format, option) {
var num = this;
var fmt = Number.getNumberFormat();
if (format == "c") {
num = Math.round(num * 100) / 100;
option = option || "$";
num = num.toLocaleString();
var s = num.split(".");
var p = s.length > 1 ? s[1] : '';
return option + s[0] + fmt.d + p.padR(2, '0');
}
if (format.substr(0, 1) == "n") {
if (format.length == 1)
return num.toLocaleString()
var dec = format.substr(1);
dec = parseInt(dec);
if (typeof (dec) != "number")
return num.toLocaleString();
num = num.toFixed(dec);
var x = num.split(fmt.d);
var x1 = x[0];
var x2 = x.length > 1 ? fmt.d + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1))
x1 = x1.replace(rgx, '$1' + fmt.c + '$2');
return x1 + x2
}
if (format.substr(0, 1) == "f") {
if (format.length == 1)
return num.toString();
var dec = format.substr(1);
dec = parseFloat(dec);
if (typeof (dec) != "number")
return num.toString();
return num.toFixed(dec);
}
return num.toString();
}
Number.getNumberFormat = function(cur) {
var t = 1000.1.toLocaleString();
var r = {};
r.d = t.substr(5,1);
if (r.d.isNumber())
r.d = t.substr(4,1);
r.c = t.substr(1, 1);
if (r.c.isNumber())
r.c = ",";
r.s = cur || "$";
return r;
}
registerNamespace = function(ns) {
var pts = ns.split('.');
var stk = window;
var nsp = "";
for (var i = 0; i < pts.length; i++) {
var pt = pts[i];
if (stk[pt])
stk = stk[pt];
else
stk = stk[pt] = {};
}
}
$.fn.serializeNoViewState = function() {
return this.find("input,textarea,select,hidden").not("#__VIEWSTATE,#__EVENTVALIDATION").serialize();
}
$.fn.makeAbsolute = function(rebase) {
///
/// Makes an element absolute
///
/// forces element onto the body tag. Note: might effect rendering or references
///
///
return this.each(function() {
var el = $(this);
var pos = el.position();
el.css({ position: "absolute",
marginLeft: 0, marginTop: 0,
top: pos.top, left: pos.left
});
if (rebase)
el.remove().appendTo("body");
});
}
var _ud = "undefined";
//})(jQuery);