﻿//--------------------------------------------------------------------------------------------------------------//
//                                   KeenOnSoft jQuery Tools Lib v.1.1                                          //
//                                      Created by: Denis Ibragimov                                             //
//                                    Copyright 2009'10 by KeenOnSoft                                           //
//--------------------------------------------------------------------------------------------------------------//
//                                              Version History                                                 //
//--------------------------------------------------------------------------------------------------------------//
// v.0.3 (Denis Ibragimov)                                                                                      //
//       + MaskInput extention and optimize current key's filters                                               //
//--------------------------------------------------------------------------------------------------------------//
// v.0.4 (Denis Ibragimov)                                                                                      //
//       + addOptions                                                                                           //
//--------------------------------------------------------------------------------------------------------------//
// v.0.5 (Denis Ibragimov)                                                                                      //
//       + realSuccess event for ajaxTools                                                                      //
//--------------------------------------------------------------------------------------------------------------//
// v.0.6 (Denis Ibragimov)                                                                                      //
//       + readOnly jQuery function                                                                             //
//--------------------------------------------------------------------------------------------------------------//
// v.0.7 (Denis Ibragimov)                                                                                      //
//       + makeButton jQuery UI function                                                                        //
//--------------------------------------------------------------------------------------------------------------//
// v.0.8 (Denis Ibragimov)                                                                                      //
//       + add jQuery initialization method                                                                     //
//       + add above IE7 XMLHttpRequest support                                                                 //
//--------------------------------------------------------------------------------------------------------------//
// v.0.9 (Denis Ibragimov)                                                                                      //
//       * fix ajaxTools beforeSend params for IE6                                                              //
//--------------------------------------------------------------------------------------------------------------//
// v.1.0 (Pavel Sambindalov)                                                                                    //
//       * changed fn.Postcode and fn.Phone																		//
//--------------------------------------------------------------------------------------------------------------//
// v.1.1 (Denis Ibragimov)                                                                                      //
//       + Add default AJAX timeout 30s   																		//
//--------------------------------------------------------------------------------------------------------------//
$(function() {
    $.ajaxSetup
        ({
            xhr: function() {
                if ($.browser.msie) {
                    try {
                        return new ActiveXObject("Msxml2.XMLHTTP");
                    } catch (e) {
                        return new ActiveXObject("Microsoft.XMLHTTP");
                    }
                }
                else {
                    return new XMLHttpRequest();
                }
            },
            timeout: 30000
        })
});
//-[ ajaxtTools ]-----------------------------------------------------------------------------------------------//
(function($) {
	//	AJAX Defaults
	var _ajaxDefaults = {
		queryType: 'POST',
		contentType: 'application/json; charset=utf-8',
		dataType: 'json',		
		url: null,
		data: new Object(),
		async: true,
		cache: true,
		username: null,
		password: null,
		beforeSend: null,
		processData: null,
		success: null,
		realSuccess: null,
		error: null,
		complete: null
	};
	//	AJAX Globals
	var _ajaxGlobals = {
		beforeSend: null,
		processData: null,
		success: null,
		realSuccess: null,
		error: null,
		complete: null
	};

	//	Main Function
	$.ajaxTools = function(options, loaderOptions) {
		options = $.extend({}, _ajaxDefaults, options);
		var sendParams = null;
		if (options.dataType == 'json') {
			sendParams = $.json.encode(options.data);
		}
		else {
			sendParams = $.json.encode(options.data);
		}
		var useLoader = loaderOptions != null;
		var startAJAX = true;
		if (typeof _ajaxGlobals.beforeSend == "function") {
		    startAJAX = _ajaxGlobals.beforeSend(options) || false;
		}
		if (startAJAX && (typeof options.beforeSend == "function")) {
		    startAJAX = options.beforeSend(options) || false;
		}
		if (startAJAX) {
			if (useLoader)
				$.loader.show(loaderOptions);
			$.ajax({
				type: options.queryType,
				async: options.async,
				cache: options.cache,
				url: options.url,
				contentType: options.contentType,
				dataType: options.dataType,
				username: options.username,
				password: options.password,
				data: sendParams,
				complete: function(xhr, textStatus) {
					var ret = true;
					if (typeof _ajaxGlobals.complete == "function") {
					    ret = _ajaxGlobals.complete(xhr, textStatus) || false;
					}
					if (ret && (typeof options.complete == "function")) {
					    ret = options.complete(xhr, textStatus) || false;
					}
					if(useLoader) 
						$.loader.hide(loaderOptions.elementID);
					return ret;
				},
				success: function(data, textStatus) {
    				var ret = true;
	    			var value = null;
				    if (typeof _ajaxGlobals.realSuccess == "function") {
				        ret = _ajaxGlobals.realSuccess(data, textStatus) || false;
				    }
				    if (ret && (typeof options.realSuccess == "function")) {
				        ret = options.realSuccess(data, textStatus) || false;
				    }
					try {
						value = $.json.decode(data.d);
					} catch (e) {
						value = data.d;
					}
					if (typeof _ajaxGlobals.success == "function") {
						ret = _ajaxGlobals.success(value, textStatus) || false;
					}
					if (ret && (typeof options.success == "function")) {
						ret = options.success(value, textStatus) || false;
					}
					return ret;
				},
				error: function(xhr, textStatus, errorThrown) {
					var ret = true;
					if (typeof _ajaxGlobals.error == "function") {
					    ret = _ajaxGlobals.error(xhr, textStatus, errorThrown) || false;
					}
					if (ret && (typeof options.error == "function")) {
					    ret = options.error(xhr, textStatus, errorThrown);
					}
					return ret;
				}
			});
		}
	};

	$.ajaxTools.defaults = function(options) {
		_ajaxDefaults = $.extend(_ajaxDefaults, options);
	};

	$.ajaxTools.globals = function(options) {
		_ajaxGlobals = $.extend(_ajaxGlobals, options);
	};
})(jQuery);

//-[ Ajax List Result methods ]---------------------------------------------------------------------------------//
$.fn.addOptions = function(data) {
    return this.each(function() {
        var list = this;
        $.each(data, function(index, itemData) {
            //var option = new Option(itemData.Text, itemData.Value);
            //list.add(option);
            var optNew = document.createElement("option");
            optNew.setAttribute("value", itemData.Value);
            optNew.appendChild(document.createTextNode(itemData.Text));
            list.appendChild(optNew);
        });
    });
}

$.fn.addAjaxListResult = function(data) {
    return this.each(function() {
        var list = this;
        $.each(data.List, function(index, itemData) {
        //var option = new Option(itemData.Text, itemData.Value);
        //list.add(option);
            var optNew = document.createElement("option");
            optNew.setAttribute("value", itemData.Value);
            optNew.appendChild(document.createTextNode(itemData.Text));
            list.appendChild(optNew);
        });
    });
};

$.fn.addAjaxValueResult = function(data) {
    return this.each(function() {
        $(this).val(data.Value);
    });
};

//-[ enable/disable controls ]----------------------------------------------------------------------------------//

$.fn.enable = function() {
    this.each(function(index, value) {
        $(value).removeAttr('disabled');
    })
};

$.fn.disable = function() {
    this.each(function(index, value) {
        $(value).attr('disabled', 'disabled');
    })
};

$.fn.readonly = function(setFlag, newClass, oldClass) {
    this.each(function(index, value) {
        if (setFlag) {
            $(value).attr('readonly', true);
        } else {
            $(value).removeAttr('readonly');
        }
        if (newClass != null) {
            $(value).addClass(newClass);
        }
        if (oldClass != null) {
            $(value).removeClass(oldClass);
        }
    })
};

$.fn.makeButton = function(ieClass) {
    if ($.browser.msie) {
        var _ieClass = 'flatlinkbutton';
        if (ieClass != null) {
            _ieClass = ieClass;
        }
        this.each(function(index, value) {
            $(value).addClass(_ieClass);
        });
    } else {
        this.each(function(index, value) {
            $(value).button();
        });
    }
}
//-[ loader control ]-------------------------------------------------------------------------------------------//

$.loader = {
    show: function(options) {
        var ret = false;
        options = $.extend({}, $.loader.defaults, options);
        if (options.showLoader && $.loader.hide(options.elementID)) {
            ret = $.loader.createLoader(options);
            if (!ret) {
                $.loader.removeItem(options.elementID);
            }
        }
    },
    hide: function(elementID) {
        return $.loader.destroyLoader(elementID);
    },
    hideAll: function() {
        for (var i = $.loader.items.length; i > -1; i--) {
            $.loader.destroyLoader($.loader.items[i].elementID);
        }
    }
};

$.extend($.loader, {
    globals: {
        prefix: 'loaderID__'
    },
    defaults: {
        elemetID: null,
        position: 'after',
        imgURL: 'Images\\Loaders\\circle_loader.gif',
        imgAlt: 'Loading...',
        imgWidth: '16px',
        imgHeight: '16px',
        showLoader: false
    },
    items: new Array(),
    addItem: function(elementID) {
        var ret = '';
        if ($.loader.findItem(elementID) == -1) {
            ret = $.loader.globals.prefix + $.loader.items.length.toString();
            var keyPair = new Object();
            keyPair.elementID = elementID;
            keyPair.loaderID = ret;
            $.loader.items.push(keyPair);
        }
        return ret;
    },
    findItem: function(elementID) {
        for (var i = 0; i < $.loader.items.length; i++) {
            if ($.loader.items[i].elementID == elementID) {
                return i;
            }
        }
        return -1;
    },
    removeItem: function(elementID) {
        var idx = $.loader.findItem(elementID);
        if (idx > -1) {
            $.loader.items.splice(idx, 1);
        }
    },
    getItemID: function(elementID) {
        var idx = $.loader.findItem(elementID);
        return $.loader.items[idx].loaderID;
    },
    destroyLoader: function(elementID) {
        var ret = true;
        try {
            if (elementID != null) {
                var idx = $.loader.findItem(elementID);
                if (idx != -1) {
                    $('#' + $.loader.getItemID(elementID)).remove();
                    $.loader.removeItem(elementID);
                }
            }
        } catch (e) { ret = false; }
        return ret;
    },
    createLoader: function(options) {
        var ret = true;
        try {
            if (options.elementID != null) {
                var loaderID = $.loader.addItem(options.elementID);
                var img = '<img id="' + loaderID + '" src="' + options.imgURL + '" alt="' + options.imgAlt + '" width="' + options.imgWidth + '" height="' + options.imgHeight + '" />';
                switch (options.position) {
                    case 'before':
                        $('#' + options.elementID).before(img);
                    case 'after':
                    default:
                        $('#' + options.elementID).after(img);
                }
            }
        } catch (e) { ret = false; }
        return ret;
    }
});

//-[ validators ]-----------------------------------------------------------------------------------------------//

$.fn.validateIt = function(options) {
    var result = true;
    $(this).find('[validate]').each(function(index, domElement) {
        result &= $(domElement).isValid(options);
    });
    return result;
}

$.fn.isValid = function(options) {
    var defaults = {
        successClass: null,
        errorClass: null
    };
    var params = $.extend({}, defaults, options);

    var value = $(this).tval();

    var validateParams = $(this).attr('validate');
    var isCheckValid = validateParams != null && validateParams != '';
    validateParams = isCheckValid ? validateParams.toLowerCase() : '';
    var isRequired = isCheckValid && (validateParams.indexOf('required') > -1 || validateParams.indexOf('*') > -1);
    var isEmail = isCheckValid && (validateParams.indexOf('email') > -1 || validateParams.indexOf('@') > -1);
    var isUrl = isCheckValid && (validateParams.indexOf('url') > -1 || validateParams.indexOf('^') > -1);

    var equalTo = $(this).attr('equalTo');
    var isCheckEqualTo = equalTo != null && equalTo != '';

    var minLength = $(this).attr('minLength');
    var isCheckMinLength = minLength != null && minLength != '';

    var maxLength = $(this).attr('maxLength');
    var isCheckMaxLength = maxLength != null && maxLength != '' && maxLength > 0;

    var regExp = $(this).attr('regExp');
    var isCheckRegExp = regExp != null && regExp != '';

    var result = true;
    result &= isRequired ? !$(this).isNullOrEmpty() : true;
    result &= isEmail ? $(this).checkForEmail() : true;
    result &= isUrl ? $(this).checkForUrl() : true;
    result &= isCheckRegExp ? $(this).checkRegExp(regExp) : true;
    if (isRequired) {
        result &= isCheckMinLength ? value.length >= minLength : true;
    } else {
        result &= isCheckMinLength ? $(this).isNullOrEmpty() || value.length >= minLength : true;
    }
    result &= isCheckMaxLength ? value.length <= maxLength : true;
    result &= isCheckEqualTo ? value == $.trim($('#' + equalTo).val()) : true;

    if (!result) {
        if (params.errorClass != null) {
            $(this).addClass(params.errorClass);
        }
        if (params.successClass != null) {
            $(this).removeClass(params.successClass);
        }
    } else {
        if (params.errorClass != null) {
            $(this).removeClass(params.errorClass);
        }
        if (params.successClass != null) {
            $(this).addClass(params.successClass);
        }
    }

    return result;
}

//-[ value functions ]------------------------------------------------------------------------------------------//

$.fn.checkForEmail = function() {
    var emailExpression = "^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$";
    return $(this).checkRegExp(emailExpression);
}

$.fn.checkForUrl = function() {
    var urlExpression = "^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|au|nz|ru)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*$";
    return $(this).checkRegExp(urlExpression);
}
$.fn.checkRegExp = function(expression) {
    var pattern = new RegExp(expression);
    return pattern.test($.trim($(this).val()));
}

$.fn.isNullOrEmpty = function() {
    var value = $(this).tval();
    if (value == null || value == undefined)
        return true;
    return value.length == 0;
}

$.fn.tval = function(value) {
    if (value === undefined) {
        return $.trim($(this).val());
    } else if (!$.isFunction(value)) {
        return $(this).val($.trim(value));
    } else {
        return $(this).val(value);
    }
}

//-[ json encode/decode ]------------------------------------------------------------------------------------//

$.json = {
    encode: function(value, replacer, space) {
        var i;
        gap = '';
        var indent = '';

        if (typeof space === 'number') {
            for (i = 0; i < space; i += 1) {
                indent += ' ';
            }

        } else if (typeof space === 'string') {
            indent = space;
        }

        rep = replacer;
        if (replacer && typeof replacer !== 'function' &&
				(typeof replacer !== 'object' ||
				 typeof replacer.length !== 'number')) {
            throw new Error('JSON.encode');
        }

        return this.str('', { '': value });
    },

    decode: function(text, reviver) {
        var j;
        var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;

        function walk(holder, key) {
            var k, v, value = holder[key];

            if (value && typeof value === 'object') {
                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = walk(value, k);
                        if (v !== undefined) {
                            value[k] = v;
                        } else {
                            delete value[k];
                        }
                    }
                }
            }
            return reviver.call(holder, key, value);
        }

        cx.lastIndex = 0;

        if (cx.test(text)) {
            text = text.replace(cx, function(a) {
                return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            });
        }

        if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
            j = eval('(' + text + ')');
            return typeof reviver === 'function' ? walk({ '': j }, '') : j;
        }

        throw new SyntaxError('JSON.parse');
    },

    f: function(n) {
        return n < 10 ? '0' + n : n;
    },

    DateToJSON: function(key) {
        return this.getUTCFullYear() + '-' + this.f(this.getUTCMonth() + 1) + '-' + this.f(this.getUTCDate()) + 'T' + this.f(this.getUTCHours()) + ':' + this.f(this.getUTCMinutes()) + ':' + this.f(this.getUTCSeconds()) + 'Z';
    },

    StringToJSON: function(key) {
        return this.valueOf();
    },

    quote: function(string) {
        var meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' };
        var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function(a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    },

    str: function(key, holder) {
        var indent = '', gap = '', i, k, v, length, mind = gap, partial, value = holder[key];

        if (value && typeof value === 'object') {
            switch ((typeof value)) {
                case 'date':
                    this.DateToJSON(key);
                    break;
                default:
                    this.StringToJSON(key);
                    break;
            }
        }

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }
        switch (typeof value) {
            case 'string':
                return this.quote(value);
            case 'number':
                return isFinite(value) ? String(value) : 'null';
            case 'boolean':
            case 'null':
                return String(value);
            case 'object':
                if (!value) {
                    return 'null';
                }
                gap += indent;
                partial = [];

                if (Object.prototype.toString.apply(value) === '[object Array]') {
                    length = value.length;

                    for (i = 0; i < length; i += 1) {
                        partial[i] = this.str(i, value) || 'null';
                    }

                    v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
                    gap = mind;
                    return v;
                }

                if (rep && typeof rep === 'object') {
                    length = rep.length;
                    for (i = 0; i < length; i += 1) {
                        k = rep[i];
                        if (typeof k === 'string') {
                            v = this.str(k, value);
                            if (v) {
                                partial.push(this.quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                } else {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = this.str(k, value);
                            if (v) {
                                partial.push(this.quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                }

                v = partial.length === 0 ? '{}' :
					gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
							mind + '}' : '{' + partial.join(',') + '}';
                gap = mind;
                return v;
        }
    }
};

//-[ Grid ]------------------------------------------------------------------------------------//

$.fn.KosGrid = function(options) {
	var options = $.extend({
		rows: null,
		columnList: null,
		headClass: 'gridHeader',
		rowClassEven: 'gridAltItem',
		rowClassOdd: 'gridItem'
	  }, options);
	
	var div = $(this);
	div.parent().attr("cellspacing", "1");
	div.parent().attr("cellpadding", "1");
	div.parent().addClass("grid");
	var head = '';
	var items = '';
	if (options.rows != null && options.rows.length > 0) {
		$.each(options.columnList, function() {
			head += '<td>' + this.head + '</td>';
		});

		var count = 0;
		$.each(options.rows, function() {
			count++;
			if (count % 2 == 0)
				items += "<tr id='" + this.ID + "' class='" + options.rowClassEven + "'>";
			else
				items += "<tr id='" + this.ID + "' class='" + options.rowClassOdd + "'>";
			$.each(this.Columns, function() {
				items += "<td>" + this.value + "</td>";
			});
			items += "</tr>";
		});

		head = "<tr class='" + options.headClass + "'>" + head + "</tr>";
	}
	div.empty();
	div.append(head + items);
};

//-[ New Grid ]------------------------------------------------------------------------------------//
$.fn.Grid = function(options) {
	var options = $.extend({
		rowsList: null,
		data: null,
		tableClass: 'gridAlt',
		headClass: 'gridHeader',
		rowClassEven: 'gridAltItem',
		rowClassOdd: 'gridItem'
	}, options);

	if (options.rowsList == null || options.data == null)
		return;

	var table = $('<table class="' + options.tableClass + '" style="width: 100%; border: 0px none;"></table>');

	var tr = "";
	$.each(options.rowsList, function() {
		tr += '<td>' + this.Title + '</td>';
	});
	table.append('<tr class="' + options.headClass + '">' + tr + '</tr>');

	$.each(options.data, function(index) {
		var row = this;
		tr = "";
		$.each(options.rowsList, function() {
			tr += '<td style="width:' + this.Width + '">' + stringFormat(this.FieldString, GetFieldsByName(this.FieldNameArray, row)) + '</td>';
		});
		table.append('<tr class="' + (index % 2 == 0 ? options.rowClassEven : options.rowClassOdd) + '">' + tr + '</tr>');
	});

	$(this).append(table);
}
function GetFieldsByName(fieldNameArray, data) {
	var array = new Array();
	$.each(fieldNameArray, function(index) {
		array[index] = data[this];
	});
	return array;
}

//-[ message dialog ]-------------------------------------------------------------------------------------------//
var messageDialog = $("<div id=\"messageDialog\" style=\"background: #fff; border: #cccccc 5px solid; padding: 5px;height:auto; display:none;\"><table align=\"center\" style=\"border: #f52c92 1px solid; height: 40px; background-color: #fcf2e5\"><tr><td name=\"messageImage\" align=\"center\" style=\"width: 23px\" valign=\"middle\"><img alt=\"\" src=\"Resources/Images/newSkin/2009/Login/warningicon.jpg\" /></td><td align=\"left\" runat=\"server\" nowrap><div name=\"message\" style=\"font-size: 12px; color: #f52c92;\" runat=\"server\"></div></td></tr></table></div>");
var questionDialog = $("<div id=\"questionDialog\" style=\"background: #fff; border: #cccccc 5px solid; padding: 5px;height:auto; display:none;\"><table align=\"center\" style=\"border: #f52c92 1px solid; height: 40px; background-color: #fcf2e5\"><tr><td align=\"center\" style=\"width: 23px\" valign=\"middle\"><img alt=\"\" src=\"Resources/Images/newSkin/2009/Login/warningicon.jpg\" /></td><td align=\"left\" runat=\"server\" nowrap><div name=\"message\" style=\"font-size: 12px; color: #f52c92;\" runat=\"server\"></div><div name=\"yesnoButtons\"><table width=\"100%\"><tr><td style=\"width:50%;\"><a class=\"yesButton\" style=\"float:right;\"></a></td><td style=\"width:50%;\"><a href=\"javascript:HideQuestionDialog();\" class=\"cancelButton\"></a></td></tr></table></div></td></tr></table></div>");
var waitDialog = $("<div id=\"waitDialog\" style=\"background: #fff; border: #cccccc 5px solid; padding: 5px;height:auto; display:none;\"><table align=\"center\" style=\"border: #f52c92 1px solid; height: 40px; background-color: #fcf2e5\"><tr><td align=\"center\" style=\"width: 31px\" valign=\"middle\"><img alt=\"\" src=\"Resources/Images/newSkin/2009/loaders/squaresCircle.gif\" /></td><td align=\"left\" runat=\"server\" nowrap><div name=\"message\" style=\"font-size: 12px; color: #f52c92;\" runat=\"server\">Please wait...</div></td></tr></table></div>");

$(document).ready(function() {
	messageDialog.dialog({
		modal: false,
		draggable: false,
		autoOpen: false,
		resizable: false,
		dialogClass: 'ui-noTitle',
		width: 'auto',
		minWidth: 0,
		minHeight: 0
	});

	questionDialog.dialog({
		modal: true,
		draggable: false,
		autoOpen: false,
		resizable: false,
		dialogClass: 'ui-noTitle',
		width: 'auto',
		minWidth: 0,
		minHeight: 0
	});

	waitDialog.dialog({
		modal: true,
		draggable: false,
		autoOpen: false,
		resizable: false,
		dialogClass: 'ui-noTitle',
		width: 'auto',
		minWidth: 0,
		minHeight: 0
	});

	$('#aspnetForm').click(function() {
		HideMessageDialog();
	});
});

function ShowMessageDialog(message, hideMessageImage) {
	if (hideMessageImage)
		messageDialog.find("[name|=messageImage]").hide();
	else
		messageDialog.find("[name|=messageImage]").show();		
	messageDialog.find("div[name|=message]").empty();
	messageDialog.find("div[name|=message]").append(message);
	return messageDialog.dialog('open');	
}

function HideMessageDialog() {
	messageDialog.dialog('close');
}

function ShowQuestionDialog(question, yesHref) {
	questionDialog.find('div[name|=message]').empty();
	questionDialog.find('div[name|=message]').append(question);
	questionDialog.find('.yesButton').attr("href", yesHref);
	questionDialog.dialog('open');
}
function HideQuestionDialog() {
	questionDialog.dialog('close');
}

function ShowWaitDialog() {
	waitDialog.dialog('open');
}
function HideWaitDialog() {
	waitDialog.dialog('close');
}

//-[ field types ]---------------------------------------------------------------------------------------------//

function getCursorPos(textElement) {
	var sOldText = textElement.val();

	var objRange = document.selection.createRange();
	var sOldRange = objRange.text;

	var sWeirdString = '#%~';

	objRange.text = sOldRange + sWeirdString; objRange.moveStart('character', (0 - sOldRange.length - sWeirdString.length));

	var sNewText = textElement.val();

	objRange.text = sOldRange;

	for (i = 0; i <= sNewText.length; i++) {
		var sTemp = sNewText.substring(i, i + sWeirdString.length);
		if (sTemp == sWeirdString) {
			var cursorPos = (i - sOldRange.length);
			return cursorPos;
		}
	}
}

function getSelectionStart(o) {
	if (o.createTextRange) {
		var r = document.selection.createRange().duplicate()
		r.moveEnd('character', o.value.length)
		if (r.text == '') return o.value.length
		return o.value.lastIndexOf(r.text)
	} else return o.selectionStart
}

function getSelectionEnd(o) {
	if (o.createTextRange) {
		var r = document.selection.createRange().duplicate()
		r.moveStart('character', -o.value.length)
		return r.text.length
	} else return o.selectionEnd
}

$.fn.MaskInput = function(mask) {
    $(this).keypress(function(e) {
        var posStart = getSelectionStart(this);
        var posEnd = getSelectionEnd(this);
        if (!compareWithRegExp(e, $(this).val(), posStart, posEnd, mask)) {
            return false;
        }
    });
    $(this).bind('paste', function(e) {
        var val = $(this).val();
        var obj = $(this);
        setTimeout(function() {
            var posStart = getSelectionStart(obj[0]);
            var posEnd = getSelectionEnd(obj[0]);
            if (!compareWithRegExp(null, obj.val(), posStart, posEnd, mask))
                obj.val(val);
        }, 0);
    });
}

$.fn.Phone = function() {
    $(this).MaskInput('^([0-9][\\d\\-\\(\\)]*)$');
}
$.fn.Postcode = function() {
	$(this).MaskInput('^([0-9]\\d*)$');
}

$.fn.Integer = function() {
    $(this).MaskInput('^([1-9]\\d*)$');
}
$.fn.Decimal = function() {
    $(this).MaskInput('^(([1-9]\\d*([.,]\\d{0,2}?)?)|(0([.,]\\d{0,2})?)|([1-9]\\d*))$');
}
$.fn.IsValueGuid = function() {
	var pattern = new RegExp('^([0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12})$');
	return pattern.test($(this).val());
};

function compareWithRegExp(e, value, posStart, posEnd, regExp) {
	var c = '';
	if (e != null)
		c = String.fromCharCode(e.which);
	var string = value.substring(0, posStart) + c + value.substring(posEnd, value.length);

	var pattern = new RegExp(regExp);
	return pattern.test(string);
};

//-[ print block ]----------------------------------------------------------------------------------------------//
function printBlock(selector) {
	ShowWaitDialog();
	productDesc = $(selector).html();
	$('body').addClass('printSelected');
	$('body').append('<div class="printSelection">' + productDesc + '</div>');
	window.print();

	window.setTimeout(pageCleaner, 0);
	HideWaitDialog();
}
function pageCleaner() {
	$('body').removeClass('printSelected');
	$('.printSelection').remove();
}

//-[ string operations ]----------------------------------------------------------------------------------------//
function stringFormat(string, array) {
	var i = 0;
	for (; ; ) {
		if (string.indexOf('{' + i + '}') < 0)
			break;
		else {
			string = string.replace(new RegExp('\\{' + i + '\\}', 'g'), array[i]);
			i++;
		}
	}
	return string;
}