/**** Constants *******/
var CSS_ERROR = 'errInput'
var MSG_ERROR = 'Some information are missing, please fill-in the hi-lighted field(s).'

var VAT_RATE = 0.175;
//var VAT_RATE = 0.150;

/**** Prototypes *******/
Event.onDomReady = function(init){
	var state = document.readyState;
	if (state && window.ActiveXObject){ //ie
		var script = $('_ie_ready_');
		if (!script){
			var src = location.protocol == "https:" ?  "https://javascript:void(0)" : "javascript:void(0)";
			document.write("<script id='_ie_ready_' defer='true' src='"+src+"'><\/script>");
		}
		Event.observe(_ie_ready_, 'readystatechange', function(){
			if (_ie_ready_.readyState == 'complete') init();
		});
		return;
	} else { //others
		var myInit = function() {
			if (arguments.callee.done) return;
			arguments.callee.done = true;
			init();
		};
		Event.observe(window, "load", myInit);
		Event.observe(document, "DOMContentLoaded", myInit);
	}
};

Object.extend(String.prototype,{
	trim: function(){
		var m =  this.match(/^\s*(\S+(\s+\S+)*)\s*$/);
		return m == null ? '' : m[1];
	},
	
	format: function (pairs, keepXtras)
	{
		var s = this;
		for(var name in pairs) 
		{
			var re = new RegExp('\\%\\{' + name + '\\}\\%', 'g');
			s = s.replace(re, pairs[name]);
		}
		if(!keepXtras) { s = s.replace(/%\{([^\}\s]+)\}%/g, ''); }
		return s;
	}
});

Date.prototype.format = function ()
{
	var d = this.getDate();
	var m = this.getMonth()+1;
	d = d<10 ? ('0'+d) : d;
	m = m<10 ? ('0'+m) : m;
	return d + '/' + m + '/' + this.getFullYear();	
}
Date.parseUK = function (str)
{
	var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
	if(! regex.test(str)) return null;
	return new Date(str.replace(regex, '$2/$1/$3'));
}

/**** Utilities *******/

var $C = document.getElementsByClassName;
var $T = function(tag, par){
 return ($(par)||document).getElementsByTagName(tag);
}

var $O = function(id){
	return opener.document.getElementById(id);
}
var $OF = function(id){
	var v = $O(id).value;
	return v ? v.trim() : v;
}

var _$F = $F;
$F = function(e){
	var v = _$F(e);
	return v ? v.trim() : v;
}

var util = {
	error: null,
	popup: null,
	dialogArgs: null,
	retValue:null,	
	modalEvents:['click', 'mousemove', 'keypress'],
	isEmpty: function(s){
		return ! /^\s*(\S+(\s+\S+)*)\s*$/.test(s);
	},
	
	hasInvailsChar: function (s, withSpace){
		return (withSpace) ? /[^a-zA-Z0-9 ]/g.test(s) :	/[^a-zA-Z0-9]/g.test(s);
	},

	isEmail: function (s){
		return  /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(s);
	},

	isDigit: function (s){
		return /^\s*\d+\s*$/.test(s);
	},
	isFloat: function (s){
		return /^\s*(\d+)?(\.(\d+))?\s*$/.test(s);
	},
	isMoney: function (s){
		return /^\s*(\d+)?(\.(\d{1,2}))?\s*$/.test(s);
	},

	isDate: function(str){
		var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
		if(! regex.test(str)) return false;
		str = str.replace(regex, '$2/$1/$3')
		var dParts = str.split('/');
		var d = new Date(str);
		for(var i=0; i<dParts.length; i++) dParts[i] = parseInt(dParts[i], 10);
		return ( dParts[0] == (1+d.getMonth()) ) && (dParts[1] == d.getDate()) && (dParts[2] == d.getFullYear()) ;
	},
	
	isNumericKey: function(event, isFloat){
		var key = event.keyCode || event.charCode;
				
		if(	event.keyCode && 
			!event.shiftKey && 
			(key > 95 && key < 106) ||
			(isFloat && (key==110 || key==190)))
			return true;
		
		if( (!event.shiftKey) && (
			(key > 47 && key < 58) || 
			(key > 36 && key < 41) ||
			(key == Event.KEY_BACKSPACE) ||
			(key == Event.KEY_TAB) ||
			(key == Event.KEY_RETURN)||
			(key == Event.KEY_DELETE) 
			))
			return true;
		
		Event.stop(event);
		return false;						
	},
	
	dateDiff: function(d1, d2){
		return Date.parseUK(d1) - (d2 ? Date.parseUK(d2) : Date.parseUK((new Date()).format()));
	},
	
	toCurrency: function(n){
		if(isNaN(+n)) n=0;
		n = (+n).toFixed(2).toString().split('.');
		return  n[0].toArray().reverse(true).join('').replace(/(\d{3})/g,'$1,')
				.toArray().reverse(true).join('').replace(/^(-)?,/,'$1')
				+ '.' + n[1];
	},
	
	setClass: function (id, cls){
		Element.addClassName(id, cls);
	},

	removeClass: function (id, cls){
		Element.removeClassName(id, cls);
	},

	alert: function(alertMsg){
		alertMsg ? alert(alertMsg) : alert(MSG_ERROR); 
	},
	
	stop: function (el, msg, event){
		el = $(el);
		msg = msg || ((el.getAttribute('tag') || el.id) + ' is required.');
		alert(msg);
		if(el.select)
			el.select();
		else
			el.focus();
		el.scrollTo();
		Event.stop(event);
		
	},

	setError: function(){
		var elems = arguments;
		
		for (var i=0; i<elems.length; i++)			
			Element.addClassName($(elems[i]), CSS_ERROR);
			
	},
	
	clearError: function(){
		var elems = arguments;
		for (var i=0; i<elems.length; i++)
			Element.removeClassName($(elems[i]), CSS_ERROR);
	},	

	reset: function(){
		var elem;
		var elems = arguments;
		for (var i=0; i<elems.length; i++){
			elem = $(elems[i]);

			if(elem.type =='text'){
				elem.value = '';
				this.clearError(elem);
			}
			else if(elem.type == 'checkbox'){
				elem.checked=false;
			}
			else if(elem.type == 'select'){
				elem.selectedIndex=0;
				this.clearError(elem);
			}
		}
	},

	validateEmpty: function (){
	
		var isValid = true;
		var elems = arguments;
		var elem = null;
		for (var i=0; i<elems.length; i++)	{
			elem = $(elems[i]);
			
			if(this.isEmpty(elem.value)){
				this.setError(elem);
				isValid=false;
				this.error = this.error || elem;
			}
			else{
				this.clearError(elem);
			}
		}
			return isValid;
	},

	validateEmail: function (){
		var isValid = true;
		var elems = arguments;		
		var elem = null;
		for (var i=0; i<elems.length; i++){
			elem = $(elems[i]);
			if(! this.isEmpty( elem.value)){
				if(! this.isEmail(elem.value)){
					this.setError(elem);
					isValid=false;
					this.error = this.error || elem;
				}
				else{
					this.clearError(elem);
				}
			}
		}
		return isValid;
	},

	validateSelect: function (){
		var isValid = true;
		var elems = arguments;
		var elem = null;
		for (var i=0; i<elems.length; i++){
			elem = $(elems[i]);
			if(elem.options.length ==0){
				this.setError(elem);
				isValid=false;
				this.error = this.error || elem;

			}
			else{
				this.clearError(elem);
			}
		}
		return isValid;
	},

	validateNumber:  function (){
		var isValid = true;
		var elems = arguments;
		var elem = null;
		for (var i=0; i<elems.length; i++){
			elem = $(elems[i]);
			if(! this.isEmpty( elem.value))	{
				if(! this.isDigit(elem.value)){
					this.setError(elem);
					isValid=false;
					this.error = this.error || elem;
				}
				else{
					this.clearError(elem);
				}
			}
		}
		return isValid;
	},
	
	validateLength: function(){
		var isValid = true;
		var elems = arguments;
		var elem = null;
		for (var i=0; i<elems.length; i++){
			elem = $(elems[i].id);
			if(! this.isEmpty( elem.value)){
				if(elem.value.trim().length < elems[i].len)	{
					this.setError(elem);
					isValid=false;
					this.error = this.error || elem;
				}
				else{
					this.clearError(elem);
				}
			}
		}
		return isValid;
		
	},

	validateEquality: function (a, b){
		a = $(a);
		b = $(b);
		if(!(this.isEmpty(a.value) && this.isEmpty(b.value))){
			if(a.value != b.value){
				this.setError(a, b);
				return false;
			}
			else{
				this.clearError(a, b);
			}
		}
		return true;
	},
	
	convertToCss: function (obj){
		var css={};
		$H(obj).each(function(i){
				css['_' + i.key] = i.value ?  '' : 'hidden';
			});
		return css;
	},
	
	formatEmptyValues: function (obj){
		obj = $H(obj);
		obj.each(function(i){
				obj[i.key] = (util.isEmpty(i.value) ||  i.value==undefined) ?  '&nbsp;' : i.value;
			});
		return obj;
	},
	
	toggleLink: function(link, disabled){
		link = $(link);
		link.disabled  = disabled;
		link.xhref = link.getAttribute('href') || link.xhref;
		link.style.cursor = disabled ? 'default' : 'auto';
		disabled ? link.removeAttribute('href') : link.setAttribute('href', link.xhref);
	},
	
	toggleLinkBtn: function(btn, disabled){
		btn = $(btn);
		btn.disabled  = disabled;
		btn.style.cursor = disabled ? 'auto' : 'pointer';		
	},

	open: function(url, width, height, hasScroll, args){
		
		util.setDialogArgs(args);
		hasScroll = hasScroll || false;
				
		util.popup = window.open(url, '', 'height=%{h}%, width=%{w}%, left=%{left}%, top=%{top}%, scrollbars=%{s}%,toolbar=no,menubar=no,location=no,resizable=no'
					.format({h:height, w:width, s:+hasScroll, 
					left:(screen.availWidth-width)/2, 
					top:(screen.availHeight-height)/2}));
		
		if(util.popup)
			util.modalEvents.each(function(e){
				Event.observe(document.body, e , util._modalBlock);
			});
		else
			util.modalEvents.each(function(e){
				Event.stopObserving(document.body, e , util._modalBlock);
			});
	},	
	_modalBlock: function(){
		try{
			if (util.popup && util.popup.document)
				util.popup.focus();
			else
				util.modalEvents.each(function(e){
					Event.stopObserving(document.body, e , util._modalBlock);
				});
		}
		catch(ex) { }
	},
		
	close: function(ret){
		if(ret && ret.isReload)
			util.reload();
		else if(ret && ret.callback){
			if(opener)
				ret.callback(ret);
		}
		close();
	},
	
	closeThumbnail: function ( arg)
	{
		alert("helllo mostafiz ");
		alert(opener.window);
		close();
	},
	reload: function(){
		if(opener)
			opener.location.reload(true);
	},	
	
	getDialogArgs: function(){
		if(opener)
			return opener.util.dialogArgs;
	},
	
	setDialogArgs: function(o){
		util.dialogArgs = o;
	},
	
	getRetValue: function(){
		return util.retValue;
	},
	
	setRetValue: function(o){
		if(opener)
		 opener.util.retValue = o;
	},

	readOnlyForm:function(){
		$A($T('input')).each(function(f){
			if(f.type == "radio")
				f.disabled = true;
			else if(f.type == "text")
					f.readOnly = true;
		});
		$A($T('textarea')).each(function(f){
			f.readOnly = true;
		});
	},
	
	ajaxLoading: function(btn){
		AjaxPro.timeoutPeriod = 60000;
		var btn = $(btn);
		var btnVal =btn.value;
		return function(l){
			btn.value= l? "Loading..." : btnVal;
			btn.disabled=l;
		};
	},
	
	ajaxResponse: function(msg, btnReset){
		btnReset = $(btnReset);
		return function(res){
			if(res.error ==null){
				alert(msg || 'Thank you for your interest in NYT.');
				if(btnReset) btnReset.click();
			}else
				alert(res.error.Message);
		};
	},
	
	setMaxHeight: function(css, delta){
		var els = $A($$(css));
		if(!els.length) return;
		var height = els.invoke('getHeight').sort();
		if(height[0] != height[height.length-1])
			els.invoke('setStyle', 
				{'height':(height[height.length-1]+delta) + 'px'});
	}
	
};

Event.observe(window, 'beforeunload', function(){
	try{
		if(window.opener && window.opener.util && window.opener.util.popup){
			window.opener.util.popup=null;
			util.modalEvents.each(function(e){
				Event.stopObserving(window.opener.document.body, e , window.opener.util._modalBlock);
			});
		}
	}catch(e){};
	
});

var ProductSummaryModes = {
	AddEdit: 1,
	CrossSales: 2,
	RequiredSales: 3,
	AlternateSales: 4,
	Select: 5
}; 



Event.observe(window, 'load', function(){
	if($('frmSearch')){
		Event.observe('txtSearch', 'keypress', function(event){
			if((event.keyCode || event.charCode) == Event.KEY_RETURN){
				Event.stop(event);
				location.href = 'search.aspx?q='+encodeURIComponent($F('txtSearch'));
			}
		});
		
		if(!/\bsearch\.aspx/i.test(location.pathname))
			Event.observe('btnSearch', 'click', function(event){
				location.href = 'search.aspx?q='+encodeURIComponent($F('txtSearch'));
			});
	}
});


