﻿Type.registerNamespace('Pol');


// Pol.UIInit ****************************
Type.registerNamespace('Pol.UIInit');

Pol.UIInit._initFuncs = [];
Pol.UIInit._oneTimeInitFuncs = [];
Pol.UIInit.addInitFunc = function(fn){
	/// registers a function that is called when the page is loaded the first time or a synchronous or asynchronous postback finished.
	Pol.UIInit._initFuncs.push(fn);
};
Pol.UIInit.addOneTimeInitFunc = function(fn){
	/// registers a function that is called when the page is loaded the first time or a synchronous or asynchronous postback finished once and then removed.
	Pol.UIInit._oneTimeInitFuncs.push(fn);
};
Pol.UIInit.callInitFuncs = function(){
	var args = arguments;
	jQuery.each(Pol.UIInit._initFuncs, function(){
		this.apply(window, args);
	});
	jQuery.each(Pol.UIInit._oneTimeInitFuncs, function(){
		this.apply(window, args);
	});
	Pol.UIInit._oneTimeInitFuncs = [];
};

Pol.UIInit.addSubmitCallback = function(fn){
	/// Add a function that is called before the form is submitted, either by a normal or async postback.
	if (!Pol.UIInit._submitCallbacks) Pol.UIInit._submitCallbacks = [];
	Array.add(Pol.UIInit._submitCallbacks, fn);	
};

Pol.UIInit.matchCurrentPage = function(pages){
	function getPageName(){
		/// returns the page name only e.g. returns 'MyPage' for url 'http://www.example.com/vdir/MyPage.aspx'
		var pn=window.location.pathname;
		return pn.substring(pn.lastIndexOf('/')+1, pn.lastIndexOf('.'));
	}

	var pages = pages.split(';'); // split matching pages
	for(var i=0; i<pages.length; i++){
		var split = pages[i].split('?'); // split for matching query parameters
		if (split.length>0 && getPageName()==split[0]){
			if (split.length==1) return true; // only matching page name
			var query = window.location.search;
			query = query.substr(query.length>0?1:0).split('&');
			var ok = true;
			for(var j=1; j<split.length; j++){
				var match = false;
				for(var k=0; k<query.length; k++){
					if (query[k]==split[j]){
						match = true;
						break;
					}
				}
				if (!match) ok = false;
			}
			if (ok) return true;
		}
	}
	return false;
}

Pol.UIInit.hilightCurrentMenus = function(){
	$('*[menuCurrent]').each(function(){
		if (Pol.UIInit.matchCurrentPage($(this).attr('menuCurrent')))
			$(this).addClass('current');
	});
};

// Pol.UI ****************************
Type.registerNamespace('Pol.UI');

Pol.UI.reloadPage = function(){
	window.location.href = window.location.href;
}

Pol.UI.setHelpPage = function(url){
	Pol.UI._helpPage = url;
}

Pol.UI.showHelpPage = function(url){
	if (typeof url != 'undefined') Pol.UI.setHelpPage(url);
	var self = this;
	$('.helpIcon').addClass('helpIconActive');
	if (Pol.UI._helpPage) window.setTimeout(function(){self._helpWindow = window.open(Pol.UI._helpPage, 'poleasyHelp', 'height=600,width=300,status=yes,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes');}, 100);
}

Pol.UI.closeHelpWindow = function(){
	if (this._helpWindow && jQuery.isFunction(this._helpWindow.close)){
		$('.helpIcon').removeClass('helpIconActive');
		this._helpWindow.close();
	}
}

Pol.UI.toggleHelp = function(){
	Pol.Server.UserSettings.ToggleHelpActive(function(result){
		if (result) Pol.UI.showHelpPage();
		else Pol.UI.closeHelpWindow();
	});
}

Pol.UI.showMessage = function(message){
	Pol.UIInit.addOneTimeInitFunc(function(){
		// This could be replaced with a nicer html message box
		alert(message);
	});
}

Pol.UI.bindEnter = function(jElements, jDestinationOrId){
	var jDest = typeof(jDestinationOrId)=='string' ? jQuery('#'+jDestinationOrId) : jDestinationOrId;
	function invoke(){
		//if (jDest.attr('disabled')===true) return false; // no need to, click doesn't fire when disabled, return true is ok
		jDest.click();
		return true;
	}
	jElements.keypress(function(evnt){
		if(evnt.keyCode==13){
			if (invoke()!==false){
				evnt.stopPropagation();
				evnt.preventDefault();
			}
		}
	});
}

Pol.UI.isIE56 = function(){
 if (!navigator || !navigator.userAgent) return false;
 return /MSIE (5\.5|6\.)/.test(navigator.userAgent);
}

// createImgButton
Pol.UI.createImgButton = function(imageUrl, cssClass){
	var jBtn;
	if (Pol.UI.isIE56()){
		jBtn = $('<span class="imgButton" tabindex="0"/>')
		.width(22).height(22)
		.css('display','inline-block')
		.css('filter', 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\''+imageUrl+'\', sizingMethod=\'scale\')');
	}
	else {
		jBtn = $('<img class="imgButton" tabindex="0"/>').attr('src', imageUrl);
	}
	
	if (cssClass) jBtn.addClass(cssClass);
	jBtn.click(function(){
		jBtn.focus(); // good idea?
	}).keypress(function(e){
		if (e.keyCode==13) {
			$(this).click();
			e.returnValue = false;
		}
	});
	return jBtn;
}

// Pol.Edit ****************************
Type.registerNamespace('Pol.Edit');

Pol.Edit.Selector = function(searchBoxId, resultTbl, searchType, maxResults, extraInfo){
	var box = $($get(searchBoxId));
	var container = box.parents('div:first');
	container[0].selector = box[0].selector = this;
	var jBody = $($($get(resultTbl)).addClass('hoverLines')[0].tBodies[0]);
	var resultLimit = maxResults || ((maxResults==0) ? 0 : 10);
	var callback = getClientSelectAttrFn();
	
	this.setCallback = container[0].setCallback = function(fn){
		callback = fn;
	};
	this.setExtraInfo = container[0].setExtraInfo = function(info){
		extraInfo = info;
	};
	function getClientSelectAttrFn(){
		var cs = container.attr('ClientSelect');
		if (!cs) return null;
		if (jQuery.isFunction(cs)) return cs;
		var fn;
		try{
			eval('fn=function(id,text){'+cs+'};');
			return fn;
		}catch(e){}
		return null;		
	}	
	function clickHandler(id, text){
		if (callback) callback(id, text);
	}
	function clearResults(){
		jBody.empty();
	}
	function createRow(id, text){
		var row = $('<tr/>').addClass('result').append($('<td/>').text(text));
		row.click(function(){
			clickHandler(id, text);
		});
		return row;
	}
	function searchCallback(result){
		box.removeClass('selectorSearching');
		clearResults();
		for(var id in result){
			jBody.append(createRow(id, result[id]));
		}
		jBody.find('tr:first').addClass('hover');
		jBody.find('tr:gt(0)').hover(function(){
			$(this).addClass('hover');
		},function(){
			$(this).removeClass('hover');
		});

	}
	var timerID;
	function delaySearch(){
		timerID=null;
		box.addClass('selectorSearching');
		Pol.Server.SelectorSearch.Search(searchType, box.val(), resultLimit, extraInfo, searchCallback);
	}
	function initDelaySearch(){
		if (timerID && window.clearTimeout) window.clearTimeout(timerID);
		timerID = window.setTimeout(delaySearch, 250);
	}
	box.keydown(function(e){
		if (e.keyCode==13) {
			jBody.find('tr:first').click();
			e.cancelBubble = true;
			e.returnValue = false;
			return false;
		} else if (e.keyCode==27) {
			clearResults();
			box.val('');
		} else {
			initDelaySearch();
		}
	})
	// no autohide on blur
	//.blur(function(){if (timerID && window.clearTimeout) window.clearTimeout(timerID);window.setTimeout(clearResults,100);})
	.focus(function(){/*if (box.val().length>0)*/initDelaySearch();});

	// perform initial search
	initDelaySearch();
}
Pol.Edit.Selector.registerClass('Pol.Edit.Selector');

Pol.GlobalEvent = $({});

Pol.Edit.makeContentEditable = function(container, type){
	var value = container.innerText;
	$(container).empty().append('<input type="text" class="borderedInput" value="'+value+'">');
};

Pol.Edit.TravelDateSync = function(startId, durationId, endId){
	var oStart = $get(startId);
	var oDuration = $get(durationId);
	var oEnd = $get(endId);
	var self = this;
	function fixDuration(){
		var val = oDuration.value;
		val = parseInt(val, 10);
		if (isNaN(val) || val<1) val = 1;
		oDuration.value = val;
	}
	function getDuration(){
		fixDuration();
		var val = parseInt(oDuration.value, 10);
		if (isNaN(val)) val = 1;
		return val;
	}
	var changing = false;
	var msPerHour = 60*60*1000;
	var msPerDay = 24*msPerHour;
	$(oStart).change(function(){
		if (!changing){
			changing = true;
			var val = oStart.getDate();
			if (val){
				oEnd.setDate(new Date(val.valueOf() + (getDuration()-1)*msPerDay));
			}
			changing = false;
			$(self).trigger('changed');
		}
	});
	//oDuration.onblur = function(){
	$(oDuration).change(function(){
		Pol.GlobalEvent.trigger('PremiumVariable_Changed','Duration');
		if (!changing){
			changing = true;
			var val = oStart.getDate();
			if (val){
				var newEndDate = new Date(val.valueOf() + (getDuration()-1)*msPerDay);
				if (newEndDate.getHours()==23) newEndDate = new Date(newEndDate.valueOf() + msPerHour);
				else if (newEndDate.getHours()==1) newEndDate = new Date(newEndDate.valueOf() - msPerHour);
				oEnd.setDate(newEndDate);
			}
			changing = false;
			$(self).trigger('changed');
		}
		return true;
	//};
	});
	$(oEnd).change(function(){
		if (!changing){
			changing = true;
			var valEnd = oEnd.getDate();
			var valStart = oStart.getDate();
			if (valEnd&&valStart){
				valEnd = valEnd.valueOf();
				valStart = valStart.valueOf();
				if (valStart>valEnd){
					valStart = valEnd;
					oStart.setDate(new Date(valStart));
				}
				$(oDuration).val(Math.round(Math.abs((valEnd-valStart)/msPerDay+1))).change();
			}
			changing = false;
			$(self).trigger('changed');
		}
	});
}
Pol.Edit.TravelDateSync.registerClass('Pol.Edit.TravelDateSync');

/*
Pol.Edit.dateToUtc = function(date){
	if (!date) return date;
	if (date.constructor!=Date) return date;
	return new Date(date.valueOf()-date.getTimezoneOffset()*60*1000);
}

Pol.Edit.dateFromUtc = function(date){
	if (!date) return date;
	if (date.constructor!=Date) return date;
	return new Date(date.valueOf()+date.getTimezoneOffset()*60*1000);
}
*/


// Pol.Grid ****************************
Type.registerNamespace('Pol.Grid');

Pol.Grid.getIdRef = function(tableRow){
	var idref = $(tableRow).find('.idref');
	if (idref.length==0) return null;
	return idref[0].innerHTML;
};

Pol.Grid.getPolTypeEditPage = function(tableRow){
	var polType = $(tableRow).find('.polType');
	if (polType.length==0) return null;
	var policyType = polType[0].innerHTML;
	return /B/i.test(policyType) ? 'PolBulkView.aspx' : 'PolView.aspx';
};


/******************
Initialization Code
*/

$(function(){ // delay executed on window load event
	Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function (sender, args) {
		Pol.UIInit.callInitFuncs.call(window, args);
	});
	
	// hilight current menu items
	Pol.UIInit.hilightCurrentMenus();
	
	$('*[init]').each(function(){
		try{
			var initScript = this.init;
			if (initScript){
				var fn;
				eval('fn=function(){'+initScript+'};');
				fn.apply(this);
			}
		}catch(e){}
	});
	
	$('.helpIcon').click(Pol.UI.toggleHelp);
});

Pol.UIInit.addInitFunc(function(arg) {
	$('table.gridTable').attr('borderColor', '#808080');

	var hoverTables = $('table.hoverLines');
	hoverTables.each(function() {
		if (!this.hoverInit) {
			this.hoverInit = true;

			var rows = $(this).children('tbody').children('tr:has(td):not(.nohoverLine)');
			rows.hover(function() {
				$(this).addClass('hover');
			}, function() {
				$(this).removeClass('hover');
			});

			hoverTables.click(function(e) {
				var target = e.srcElement || e.target;
				if (target && target.cancelRowClick) return;

				var row = $(target).parents('tr:first');
				if (row.length == 0) return;
				var rowElement = row[0];
				if (!Pol.Grid.getIdRef(rowElement)) return;
				var handler = row.parents('table[rowclick]:first').attr('rowclick');
				if (!handler) return;
				if (jQuery.isFunction(handler))
					handler.apply(rowElement);
				else
					(function(e) { eval(handler); }).call(rowElement, e);
			});

		}
	});

	$('input.date-picker').datePicker(); // init date-pickers
});

Sys.Application.add_load(function(){
	// hook up the PageRequestManager's onSubmit statements
	Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {
			var fns = Pol.UIInit._submitCallbacks;
			if (fns) {
				for(var i=0; i<fns.length; i++)
					fns[i]();
			}
			return true;
	});
});
