// ###### Check functions ####################################################################################
function trim(string)
{
    return string.replace(/(^\s+)|(\s+$)/g, "");
}

function checkUsername(usernameStr)
{
 var rex = new RegExp("^[A-Za-z0-9_-]{4,}$", "i");
    if(!rex.test(usernameStr))
    {
     return false;
    }
  return true;
}

function checkIsIntNumberCorrect(sNumber)
{
	var re = new RegExp("^(\\d)+$");
	var ares = re.exec(sNumber); 
	if ( null == ares )
	{
		return false;
	}

	return true;
}

function checkIsDoubleNumberCorrect(sNumber)
{
	var re = new RegExp("^-?(\\d)+(\\.(\\d)+)?$");
	var ares = re.exec(sNumber);
	if ( null == ares )
	{
		return false;
	}

	return true;
}

function checkIsUnsignedDoubleNumberCorrect(sNumber)
{
	var re = new RegExp("^(\\d)+(\\.(\\d)+)?$");
	var ares = re.exec(sNumber); 
	if ( null == ares )
	{
		return false;
	}

	return true;
}

function checkEmail(sEmail)
{
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(sEmail)) {
		return true;
	}
	return false;
}

// Checks for the following valid date formats:
// DD/MM/YY   DD/MM/YYYY   DD-MM-YY
// Also separates date into month, day, and year variables
function isValidDate(dateStr) {
    
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

    // To require a 4 digit year entry, use this line instead:
    // var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

    var matchArray = dateStr.match(datePat); // is the format ok?
    if (matchArray == null) {
    //alert("Date is not in a valid format.")
    return false;
    }
    month = matchArray[3]; // parse date into variables
    day = matchArray[1];
    year = matchArray[4];

    var d = new Date();
    var curr_year = d.getFullYear();
    if (year < 1900 || year > (curr_year-18))
    {
        return false;
    }

    if (month < 1 || month > 12) { // check month range
    //alert("Month must be between 1 and 12.");
    return false;
    }
    if (day < 1 || day > 31) {
    //alert("Day must be between 1 and 31.");
    return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
    //alert("Month "+month+" doesn't have 31 days!")
    return false
    }
    if (month == 2) { // check for february 29th
    var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    if (day>29 || (day==29 && !isleap)) {
    //alert("February " + year + " doesn't have " + day + " days!");
    return false;
       }
    }
return true;  // date is valid
}

// ###### Output text functions ###############################################################################

function priceFormat(value)
{
 	var ValueStr = new String( value );
	var ind = ValueStr.lastIndexOf(".");
	// xxxx.xx
	if ( ind >= 0 )
	{
		if ( ind == ValueStr.length - 2 )
		{
			ValueStr += "0";
		}
	
		if ( ind < ValueStr.length - 3 )
		{
			ValueStr = ValueStr.substr(0, ind + 3);
		}
	}
	else
	{
		ValueStr += ".00";
	}
	// xxxx.xx
	
	// x,xxx.xx
	ind = ValueStr.lastIndexOf(".");
	if ( ind >= 4 )
	{
		ValueStr = ValueStr.substr(0, ind - 3) + "," + ValueStr.substr(ind - 3, 6);
	}
	// x,xxx.xx
	return ValueStr;
}

// ###### Ajax syncronized functions ###############################################################################
var url_next_syncronized = '';

function loadurlSyncronized(url_first, url_next, obj_output) 
{
    var url_first = url_first.split('?');
    var url_next = url_next.split('?');
	$.ajax({
		type: "POST",
                url: url_first[0],
                data: url_first[1],
		dataType: "html",
                beforeSend: function()
   		{
                    $("#listing").fadeTo("fast", 0.33);
                },
               complete: function()
   		{
                    $("#listing").fadeTo("fast", 1);
                },
		success: function(data_first){ 
			$('#errorMessage').html(data_first);
			$.ajax({
				type: "POST",
                                url: url_next[0],
                                data: url_next[1],
				dataType: "html",
				complete: function(){},
				success: function(data_next){ 
					if (obj_output == null) obj_output = 'listing';
					$('#'+obj_output).html(data_next);
				},
				error: function()
				{
					//alert('Export operation failed!');
				}
			});
		},
		error: function()
		{
			//alert('Export operation failed!');
		}
	});
}

function loadurl(url, obj_output) 
{
	$.ajax({
		type: "POST",
		url: url,
		dataType: "html",
                beforeSend: function()
   		{
                    $("#listing").fadeTo("fast", 0.33);
                },
               complete: function()
   		{
                    $("#listing").fadeTo("fast", 1);
                },
		success: function(data){ 
			if (obj_output == null) obj_output = 'listing';
			$('#'+obj_output).html(data);
		},
		error: function()
		{
			//alert('Export operation failed!');
		}
	});
}

function loadurlListing(dest) 
{
	loadurl(dest);
}

function alertUrl(url) 
{
	$.ajax({
		type: "POST",
		url: url,
		dataType: "html",
		complete: function(){},
		success: function(data){ 
			if (data != '') alert(data);
		},
		error: function()
		{
			//alert('Export operation failed!');
		}
	});
}

// ###### Element view actions ###############################################################################
function loadURLElement(url, obj_output, data) 
{
	var data;
	if (null == data || undefined == data) data = {};	

	$.ajax({
		type: "POST",
		url: url,
		data : data,
		dataType: "html",
                beforeSend: function()
   		{
                    $("#"+obj_output).fadeTo("fast", 0.33);
                },
               complete: function()
   		{
                    $("#"+obj_output).fadeTo("fast", 1);
                },
		success: function(data){ 
			$('#'+obj_output).html(data);
		},
		error: function()
		{
			alert('Export operation failed!');
		}
	});

	$('#'+obj_output).css('display', 'block');
}  

function hideElement(obj_output)
{
//	$('#'+obj_output).fadeOut();
	$('#'+obj_output).css('display', 'none');
	$('#'+obj_output).html("");
}

// ###### Block popup functions ###############################################################################
function updatePopupWindow(url_new)
{
	$('#modalContent').css('display', 'none');
	$('#modalContent').html("");
	$('#modalPreloader').css('display', 'block');
	
	$.ajax({
			type: "POST",
			url: url_new,
		    dataType: "html",
			complete: function(){},
			success: function(data){ 
				$('#modalPreloader').css('display', 'none');
				$('#modalContent').css('display', 'block');
				$('#modalContent').html(data);
			},
			error: function()
			{
				//alert('Export operation failed!');
			}
		});
}

function getBodyScrollTop()
{
	return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
}

function popupWindow(nWidth, nHeight, url_show)
{
	updatePopupWindow(url_show);

	$('#modalContent').css('display', 'block');

	if (nWidth <= 0) nWidth = $(window).width();

	// show modal window
        $('#body').block({
        message: $('#modalWindow'),
     // disable vertical centering
        centerY: false,
        css:
        {
                            //top:  ($(window).height() - nHeight) /2 + 'px',
                            top: getBodyScrollTop() + 40,
                            left: ($(window).width() - nWidth) /2 + 'px',
                            width: nWidth + 'px',
                            heigth: nHeight + 'px'
                    }
    });
	 $(".blockOverlay").css('height',$(document).height());
}
function closePopup()
{
	$('#modalContent').html("");
	$('#body').unblock({ }); 

}

// ###### Confirm functions ###############################################################################
function confirm_state_change() 
{
	if (confirm('Are you sure you want to change checked items state?')) {
		return true;
	} else {
		return false;
	}
}

function confirm_delete() 
{
	if (confirm('Are you sure you want to remove?')) {
		return true;
	} else {
		return false;
	}
}

// ###### Other functions ###############################################################################
function _onmouseout (_scr, _Img) {
   eval ("document.images." + _Img + ".src = '" + _scr + "'" ) ;
}


function loadurlListingSyncronized(dest) {

    var data;
     	$.ajax({
		   type: "GET",
		   dataType: "html",
		   error: function(response){showMessage('error ' + response.status, 'Error while getting data...');},
		   url: dest,
		   data: data,
		   success: function(response)
               {
//                    hidePopup();
                    $("#listing").html(response);
               }
		});

}


function doSearch(bm, tab_id) {
    var bm, tab_id;
    var search = '';
    //if ($('#search').val())
        search = '&search=' + $('#search').val();
    //window.location.href='index.php?bm='+bm+'&a=10.00&tab_id='+tab_id+'&id=0&search=' + $('#search').val();
    window.location.href='index.php?bm='+$.getUrlVars('bm')+'&a=10.00&tab_id='+tab_id+'&id='+$.getUrlVars('id') + search;
    //loadurlListing('index.php?bm='+getUrlVars()['bm']+'&a=10.00'+tab_id+'&id='+getUrlVars()['id']+'&search=' + $('#search').val() );
}

function initTinyMCE(element)
{
       tinyMCE.init({
          mode : "exact",
          elements : element,
          theme : "advanced",
          theme_advanced_buttons1_add_before : "save,newdocument,separator, fontsizeselect",
          theme_advanced_buttons2_add_before: "cut,copy,paste,separator,forecolor,backcolor",
          theme_advanced_toolbar_location : "top",
          theme_advanced_toolbar_align : "left",
          theme_advanced_statusbar_location : "bottom",
          plugi2n_insertdate_dateFormat : "%Y-%m-%d",
          plugi2n_insertdate_timeFormat : "%H:%M:%S",
          file_browser_callback : "fileBrowserCallBack",
          paste_use_dialog : false,
          theme_advanced_resizing : false,
          theme_advanced_resize_horizontal : true,
          theme_advanced_link_targets : "_something=My somthing;_something2=My somthing2;_something3=My somthing3;",
          paste_auto_cleanup_on_paste : true,
          paste_convert_headers_to_strong : false,
          paste_strip_class_attributes : "all",
          paste_remove_spans : false,
          paste_remove_styles : false,
          relative_urls : false,
          remove_script_host : false,
          convert_urls : false          
     });
}

function initTinyMCE_full(element)
{
       tinyMCE.init({
          mode : "exact",
          elements : element,
          plugins : "paste",
          theme : "advanced",
          theme_advanced_buttons1_add_before : "save,newdocument,separator, fontsizeselect",
          theme_advanced_buttons2_add_before: "cut,copy,paste,pasteword,separator,forecolor,backcolor",
          theme_advanced_buttons3_add_before : "ibrowser",
          theme_advanced_toolbar_location : "top",
          theme_advanced_toolbar_align : "left",
          theme_advanced_statusbar_location : "bottom",
          plugi2n_insertdate_dateFormat : "%Y-%m-%d",
          plugi2n_insertdate_timeFormat : "%H:%M:%S",
          //file_browser_callback : "fileBrowserCallBack",
          file_browser_callback : "tinyBrowser",
          paste_use_dialog : false,
          theme_advanced_resizing : false,
          theme_advanced_resize_horizontal : true,
          theme_advanced_link_targets : "_something=My somthing;_something2=My somthing2;_something3=My somthing3;",
          paste_auto_cleanup_on_paste : true,
          paste_convert_headers_to_strong : false,
          paste_strip_class_attributes : "all",
          paste_remove_spans : false,
          paste_remove_styles : false,
          relative_urls : false,
          remove_script_host : false,
          convert_urls : false          
          
         // Other options
         // relative_urls : false
     });
}



// Get object of URL parameters
//var allVars = $.getUrlVars();
// Getting URL var by its nam
//var byName = $.getUrlVar('name');
$.extend({
  getUrlVars: function(){
    var hash;
    var vars = new Object();
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      vars[hash[0]] = hash[1];
    }
    return vars;
  },
  getUrlVar: function(name){
    return $.getUrlVars()[name];
  }
});

//Reload listing table
function reloadListing()
{
    var data = '';
    var params = $.getUrlVars();
    if (params.tab_id) params.a = '10.00' + params.tab_id;
    else params.a = '10.001';
    $.each(params, function(key, value) {
        data += '&' + key + '=' + value;
    });
    data = data.substr(1);
    loadURLElement('index.php', 'listing', data);

}

function blockStandart(element) {
    if ($('#'+element+' .blockUI').size() == 0 )
    {
        $("#"+element).block({
                            message: '',
                            css: {
                                    backgroundColor: '#fff',
                                    color: '#000',
                                    top:'1%',
                                    left:'1%',
                                    width:'100px'
                            },
                            overlayCSS:  {
                                backgroundColor: '#fff',
                                opacity:         0.6
                            },
                            centerY: false,
                            centerX: false
                        });
    }
}

/*
 * Tooltip
 */
function showTooltip(id)
{
    var id;
    var content = $("#preview_"+id).attr('content');

    $('<div class="tooltip">' + content + '</div>').appendTo("#preview_"+id).fadeIn('fast');




//NOT WORKING IN IE(
//    $(this).bind('mousemove', function(e){
//            $('div.tooltip').css({
//                    'top': e.pageY - ($('div.tooltip').height() / 2) - 5,
//                    'left': e.pageX + 15
//            });
//    });

//    $(this).bind('mouseleave', function(e){
//        hideTooltip();
//    });
}

function hideTooltip()
{
    $('div.tooltip').remove();
}


(function($){
 $.fn.extend({

 	customStyle : function(options) {
          var classStyle = 'customStyle';
          if (options) classStyle = options;

	  if(!$.browser.msie || ($.browser.msie&&$.browser.version>6)){
	  return this.each(function() {

                var currentSelected = $(this).find(':selected');
                $(this).after('<span class="'+classStyle+'SelectBox"><span class="'+classStyle+'SelectBoxInner">'+currentSelected.text()+'</span></span>').css({position:'absolute', opacity:0,fontSize:$(this).next().css('font-size')});
                var selectBoxSpan = $(this).next();
                var selectBoxWidth = parseInt($(this).width()) - parseInt(selectBoxSpan.css('padding-left')) -parseInt(selectBoxSpan.css('padding-right'));
                var selectBoxSpanInner = selectBoxSpan.find(':first-child');
                selectBoxSpan.css({display:'inline-block'});
                selectBoxSpanInner.css({width:selectBoxWidth, display:'inline-block'});
                var selectBoxHeight = parseInt(selectBoxSpan.height()) + parseInt(selectBoxSpan.css('padding-top')) + parseInt(selectBoxSpan.css('padding-bottom'));
                $(this).height(selectBoxHeight).change(function(){
                        // selectBoxSpanInner.text($(this).val()).parent().addClass('changed');   This was not ideal
                selectBoxSpanInner.text($(this).find(':selected').text()).parent().addClass('changed');
                });

	  });
	  }
	}
 });
})(jQuery);

/* JSON parser */
(function($){$.toJSON=function(o)
{if(typeof(JSON)=='object'&&JSON.stringify)
return JSON.stringify(o);var type=typeof(o);if(o===null)
return"null";if(type=="undefined")
return undefined;if(type=="number"||type=="boolean")
return o+"";if(type=="string")
return $.quoteString(o);if(type=='object')
{if(typeof o.toJSON=="function")
return $.toJSON(o.toJSON());if(o.constructor===Date)
{var month=o.getUTCMonth()+1;if(month<10)month='0'+month;var day=o.getUTCDate();if(day<10)day='0'+day;var year=o.getUTCFullYear();var hours=o.getUTCHours();if(hours<10)hours='0'+hours;var minutes=o.getUTCMinutes();if(minutes<10)minutes='0'+minutes;var seconds=o.getUTCSeconds();if(seconds<10)seconds='0'+seconds;var milli=o.getUTCMilliseconds();if(milli<100)milli='0'+milli;if(milli<10)milli='0'+milli;return'"'+year+'-'+month+'-'+day+'T'+
hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
if(o.constructor===Array)
{var ret=[];for(var i=0;i<o.length;i++)
ret.push($.toJSON(o[i])||"null");return"["+ret.join(",")+"]";}
var pairs=[];for(var k in o){var name;var type=typeof k;if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;if(typeof o[k]=="function")
continue;var val=$.toJSON(o[k]);pairs.push(name+":"+val);}
return"{"+pairs.join(", ")+"}";}};$.evalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);return eval("("+src+")");};$.secureEvalJSON=function(src)
{if(typeof(JSON)=='object'&&JSON.parse)
return JSON.parse(src);var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};$.quoteString=function(string)
{if(string.match(_escapeable))
{return'"'+string.replace(_escapeable,function(a)
{var c=_meta[a];if(typeof c==='string')return c;c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};})(jQuery);


/*
	Watermark v3.1.3 (March 22, 2011) plugin for jQuery
	http://jquery-watermark.googlecode.com/
	Copyright (c) 2009-2011 Todd Northrop
	http://www.speednet.biz/
	Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function(a,h,y){var w="function",v="password",j="maxLength",n="type",b="",c=true,u="placeholder",i=false,t="watermark",g=t,f="watermarkClass",q="watermarkFocus",l="watermarkSubmit",o="watermarkMaxLength",e="watermarkPassword",d="watermarkText",k=/\r/g,s="input:data("+g+"),textarea:data("+g+")",m="input:text,input:password,input[type=search],input:not([type]),textarea",p=["Page_ClientValidate"],r=i,x=u in document.createElement("input");a.watermark=a.watermark||{version:"3.1.3",runOnce:c,options:{className:t,useNative:c,hideBeforeUnload:c},hide:function(b){a(b).filter(s).each(function(){a.watermark._hide(a(this))})},_hide:function(a,r){var p=a[0],q=(p.value||b).replace(k,b),l=a.data(d)||b,m=a.data(o)||0,i=a.data(f);if(l.length&&q==l){p.value=b;if(a.data(e))if((a.attr(n)||b)==="text"){var g=a.data(e)||[],c=a.parent()||[];if(g.length&&c.length){c[0].removeChild(a[0]);c[0].appendChild(g[0]);a=g}}if(m){a.attr(j,m);a.removeData(o)}if(r){a.attr("autocomplete","off");h.setTimeout(function(){a.select()},1)}}i&&a.removeClass(i)},show:function(b){a(b).filter(s).each(function(){a.watermark._show(a(this))})},_show:function(g){var p=g[0],u=(p.value||b).replace(k,b),h=g.data(d)||b,s=g.attr(n)||b,t=g.data(f);if((u.length==0||u==h)&&!g.data(q)){r=c;if(g.data(e))if(s===v){var m=g.data(e)||[],l=g.parent()||[];if(m.length&&l.length){l[0].removeChild(g[0]);l[0].appendChild(m[0]);g=m;g.attr(j,h.length);p=g[0]}}if(s==="text"||s==="search"){var i=g.attr(j)||0;if(i>0&&h.length>i){g.data(o,i);g.attr(j,h.length)}}t&&g.addClass(t);p.value=h}else a.watermark._hide(g)},hideAll:function(){if(r){a.watermark.hide(m);r=i}},showAll:function(){a.watermark.show(m)}};a.fn.watermark=a.fn.watermark||function(p,o){var t="string";if(!this.length)return this;var s=i,r=typeof p===t;if(r)p=p.replace(k,b);if(typeof o==="object"){s=typeof o.className===t;o=a.extend({},a.watermark.options,o)}else if(typeof o===t){s=c;o=a.extend({},a.watermark.options,{className:o})}else o=a.watermark.options;if(typeof o.useNative!==w)o.useNative=o.useNative?function(){return c}:function(){return i};return this.each(function(){var B="dragleave",A="dragenter",z=this,i=a(z);if(!i.is(m))return;if(i.data(g)){if(r||s){a.watermark._hide(i);r&&i.data(d,p);s&&i.data(f,o.className)}}else{if(x&&o.useNative.call(z,i)&&(i.attr("tagName")||b)!=="TEXTAREA"){r&&i.attr(u,p);return}i.data(d,r?p:b);i.data(f,o.className);i.data(g,1);if((i.attr(n)||b)===v){var C=i.wrap("<span>").parent(),t=a(C.html().replace(/type=["']?password["']?/i,'type="text"'));t.data(d,i.data(d));t.data(f,i.data(f));t.data(g,1);t.attr(j,p.length);t.focus(function(){a.watermark._hide(t,c)}).bind(A,function(){a.watermark._hide(t)}).bind("dragend",function(){h.setTimeout(function(){t.blur()},1)});i.blur(function(){a.watermark._show(i)}).bind(B,function(){a.watermark._show(i)});t.data(e,i);i.data(e,t)}else i.focus(function(){i.data(q,1);a.watermark._hide(i,c)}).blur(function(){i.data(q,0);a.watermark._show(i)}).bind(A,function(){a.watermark._hide(i)}).bind(B,function(){a.watermark._show(i)}).bind("dragend",function(){h.setTimeout(function(){a.watermark._show(i)},1)}).bind("drop",function(e){var c=i[0],a=e.originalEvent.dataTransfer.getData("Text");if((c.value||b).replace(k,b).replace(a,b)===i.data(d))c.value=a;i.focus()});if(z.form){var w=z.form,y=a(w);if(!y.data(l)){y.submit(a.watermark.hideAll);if(w.submit){y.data(l,w.submit);w.submit=function(c,b){return function(){var d=b.data(l);a.watermark.hideAll();if(d.apply)d.apply(c,Array.prototype.slice.call(arguments));else d()}}(w,y)}else{y.data(l,1);w.submit=function(b){return function(){a.watermark.hideAll();delete b.submit;b.submit()}}(w)}}}}a.watermark._show(i)})};if(a.watermark.runOnce){a.watermark.runOnce=i;a.extend(a.expr[":"],{data:function(c,d,b){return!!a.data(c,b[3])}});(function(c){a.fn.val=function(){var e=this;if(!e.length)return arguments.length?e:y;if(!arguments.length)if(e.data(g)){var f=(e[0].value||b).replace(k,b);return f===(e.data(d)||b)?b:f}else return c.apply(e,arguments);else{c.apply(e,arguments);a.watermark.show(e);return e}}})(a.fn.val);p.length&&a(function(){for(var b,c,d=p.length-1;d>=0;d--){b=p[d];c=h[b];if(typeof c===w)h[b]=function(b){return function(){a.watermark.hideAll();return b.apply(null,Array.prototype.slice.call(arguments))}}(c)}});a(h).bind("beforeunload",function(){a.watermark.options.hideBeforeUnload&&a.watermark.hideAll()})}})(jQuery,window);



/* Timers */
jQuery.fn.extend({
	everyTime: function(interval, label, fn, times, belay) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times, belay);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	}
});


jQuery.extend({
	timer: {
		guid: 1,
		global: {},
		regex: /^([0-9]+)\s*(.*s)?$/,
		powers: {
			// Yeah this is major overkill...
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
				return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseInt(result[1], 10);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times, belay) {
			var counter = 0;

			if (jQuery.isFunction(label)) {
				if (!times)
					times = fn;
				fn = label;
				label = interval;
			}

			interval = jQuery.timer.timeParse(interval);

			if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
				return;

			if (times && times.constructor != Number) {
				belay = !!times;
				times = 0;
			}

			times = times || 0;
			belay = belay || false;

			if (!element.$timers)
				element.$timers = {};

			if (!element.$timers[label])
				element.$timers[label] = {};

			fn.$timerID = fn.$timerID || this.guid++;

			var handler = function() {
				if (belay && this.inProgress)
					return;
				this.inProgress = true;
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
				this.inProgress = false;
			};

			handler.$timerID = fn.$timerID;

			if (!element.$timers[label][fn.$timerID])
				element.$timers[label][fn.$timerID] = window.setInterval(handler,interval);

			if ( !this.global[label] )
				this.global[label] = [];
			this.global[label].push( element );

		},
		remove: function(element, label, fn) {
			var timers = element.$timers, ret;

			if ( timers ) {

				if (!label) {
					for ( label in timers )
						this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.$timerID ) {
							window.clearInterval(timers[label][fn.$timerID]);
							delete timers[label][fn.$timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}

					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}

				for ( ret in timers ) break;
				if ( !ret )
					element.$timers = null;
			}
		}
	}
});



