/// <reference path="jquery-1.3.2-vsdoc2.js" />

/* CONTENTS ************************************************
	1.0 Expressions
		1.1 Contains Ignore Case
	2.0 Custom Functions
		2.1 Javascript Css
		2.2 Expanding Lists
		2.3 Find a Service
		2.4 Datepicker (Event Calander)
		2.5 Fieldset Submit
		2.6 Header Imagery

********************************************************* */

/***** 1.1 Contains Ignore Case *****/
jQuery.expr[':'].containsIgnoreCase = function(a,i,m){  
	return (" "+jQuery(a).text()+" ").toUpperCase().indexOf(m[3].toUpperCase())>=0; 
	//       ^--------------------^--- need the spaces or IE doesn't find strings _beginning_ with search term???
};

/***** 2.1 Javascript Css *****/
(function() {
	var head = document.getElementsByTagName("head")[0];
	if (head) {
		var scriptStyles = document.createElement("link");
		scriptStyles.rel = "stylesheet";
		scriptStyles.type = "text/css";
		scriptStyles.href = "/css/pncc-javascript.css";
		scriptStyles.media = "screen,print";
		head.appendChild(scriptStyles);
	}
}());

/***** 2.2 Expanding Lists *****/
var AlphaList = {
	Init:function(){
		// Insert Open All Option
		Frontend.AlphaList.InsertShowAllOption();
		
		// Show only character if in url
		if(location.hash != ''){
			var targetId = location.hash;
			var targethighlite = $("#content .cont-alpha-index > ul > li > a[href="+targetId+"]")
			Frontend.AlphaList.RemoveHighlight();
			Frontend.AlphaList.AddHighlight(targethighlite);
			Frontend.AlphaList.CloseAll();
			Frontend.AlphaList.OpenById(targetId);
			window.scrollTo(0,0);
		}
		
		// Disable all index links that have no listings
		$("#content ul.cont-alpha-listing > li").each(function(){
			var groupId = $(this).children("h2").attr("id");
			var listNum = $(this).find("li > a").length;
			if(listNum==0) {
				$("#content .cont-alpha-index > ul > li > a[href=#"+groupId+"]").addClass("disabled");
			}
		});
		
		// Listen for actions/events
		$(".cont-alpha-index li a").click(function(){
			if($(this).parent("li").hasClass("alpha-all")){
				Frontend.AlphaList.RemoveHighlight();
				Frontend.AlphaList.AddHighlight($(this));
				Frontend.AlphaList.OpenAll();
				
			} else if(!$(this).hasClass("disabled")){
				var targetID = $(this).attr("href");
				Frontend.AlphaList.RemoveHighlight();
				Frontend.AlphaList.AddHighlight($(this));
				Frontend.AlphaList.CloseAll();
				Frontend.AlphaList.OpenById(targetID);
			}
			return false;
		});
	},
	
	InsertShowAllOption:function(){
		var showAllHtml = '<li class="alpha-all"><a class="selected" href="#">All</a></li>';
		$(".cont-alpha-index ul").prepend(showAllHtml);
	},
	
	OpenById:function(targetID){
		$(".cont-alpha-listing li h2"+targetID).parent().show();
	},
	
	OpenAll:function(){
		$(".cont-alpha-listing > li").show();
	},
	
	CloseAll:function(){
		$(".cont-alpha-listing > li").hide();
	},
	
	AddHighlight:function(target){
		$(target).addClass("selected");
	},
	
	RemoveHighlight:function(){
		$(".cont-alpha-index a.selected").removeClass("selected");
	}
}

/***** 2.3 Find a Service *****/
var FindAService = {
	Init:function(){
		// usage: add the class 'submit-on-enter' to any element
		$("input[type=text].dynamicSearchBox").keyup(function(ev) {
			var maxToShow = 10 ;
			$("#content .cont-keyword-listing > ul").children().remove();
			$("#content .cont-keyword-listing > p").remove();
			$("#content .cont-keyword-listing > ul").hide();
			if(this.value.length > 0){
				$("#content .cont-keyword-listing > ul").show();
				var count = 0;
				$(".cont-alpha-listing ul>li>a:containsIgnoreCase( "+this.value+")").each(function(i){
					count = i;
					if(count<maxToShow)
						$(".cont-keyword-listing ul").append("<li>"+$(this).parent().html()+"</li>");
				});      
				
				if(count>=maxToShow)
					$(".cont-keyword-listing").append("<p>Showing first "+maxToShow+" only</p>");
			}
		});
	}
}

/***** 2.4 Datepicker (Event Calander) *****/
var Datepicker = {
	Init: function() {
		$('.form-event-calendar .date-select').append('<a href="#" title="pick a date" class="datepicker-launch">pick a date</a>');
		$('.datepicker-launch').each(function() {
			var currentElement = $(this);
			if (Frontend.Datepicker.GetDate(currentElement).length > 0)
				currentElement.siblings("span.tag-text").hide();
			else
				currentElement.siblings("input.selected-date").hide();

			var firstEnabled=0;
			var lastEnabled=0;
			if (currentElement.siblings("input.first-enabled-date").length > 0)
				firstEnabled = ParseISOToJsDate(currentElement.siblings("input.first-enabled-date").val());
			if (currentElement.siblings("input.last-enabled-date").length > 0)
				lastEnabled = ParseISOToJsDate(currentElement.siblings("input.last-enabled-date").val());

			var now = new Date();

			$(this).DatePicker({
				format: 'Y-m-d',
				date: Frontend.Datepicker.GetDate(currentElement),
				current: Frontend.Datepicker.GetDate(currentElement),
				starts: 1,
				position: 'left',
				prev: "<",
				next: ">",
				onBeforeShow: function() {
					if (Frontend.Datepicker.GetDate(currentElement).length > 0)
						currentElement.DatePickerSetDate(Frontend.Datepicker.GetDate(currentElement), true);
				},
				onRender: function(date) {
					return {
						disabled: ((firstEnabled>0 && (date.valueOf() < firstEnabled.valueOf())) || (lastEnabled>0 && (date.valueOf() > lastEnabled.valueOf())))
					}
				},
				onChange: function(formated, dates) {
					if (formated != "NaN-NaN-NaN") // work around for month select bug
						Frontend.Datepicker.SetDate(formated, dates, currentElement);
				},
				onShow: function() {
					$('.datepickerMonth a').css('cursor','default');
					$('.datepickerMonth a').click(function(){ return false; });
					if($.browser.msie) $('div.datepicker').css('left', $('a.datepicker-launch:first').offset().left + 20 + 'px');
				}
			});
		});
	},
	GetDate:function(currentElement){
		var dateField = currentElement.siblings(".yearList").val() + '-' + currentElement.siblings(".monthList").val() + '-' + currentElement.siblings(".dayList").val();
		return dateField;
	},
	SetDate:function(formated, dates, currentElement){
		
		var yearSelect = currentElement.siblings(".yearList");
		var monthSelect = currentElement.siblings(".monthList");
		var daySelect = currentElement.siblings(".dayList");
		
		var dateValues = formated.split('-');
		
		yearSelect.val(dateValues[0]);
		monthSelect.val(dateValues[1]);
		daySelect.val(dateValues[2]);
		
		currentElement.siblings("span.tag-text").hide();
		currentElement.DatePickerHide();
	}
}

// MATRIX UTIL FUNCTIONS =======================================================
function ParseISOToJsDate(isoDate){
	// takes an ISO formatted date and returns a javascript date object
	isoArr 		= isoDate.split("-");
	tmpDate 	= new Date( isoArr[0], isoArr[1]-1, isoArr[2], 0, 0, 0, 0 );
	return tmpDate;
}

/***** 2.5 Set Form Button *****/
var FieldsetSubmit = {
	Init: function() {
		$('.form-event-calendar, .form-general, .site-search, .form-keyword-result').each(function() {
			$(this).find("input[type=text], textarea, input[type=password], select").keydown(function(ev) {
				if (ev.keyCode == 13) {
					ev.preventDefault();
					ev.stopPropagation();
					$(this).parents('fieldset:first').find("input.field-btn:first, input[type=image]:first, input[type=submit]:first").click();
					return false;
				}
			});
		});
	}
};

/***** 2.6 Header Background Imagery *****/
var HeaderImagery = {
	Init: function() {
		var filePath = "/images/interface/bg/";
		var body = $("body");
		var header = $("#header");
		var sectionNames = new Array("","services","council","leisure","learning","living","business","city","visit");
		var sectionImages = new Array();		
		sectionImages[0] =	new Array("bg-header-imagery-01.jpg","bg-header-imagery-02.jpg");
		sectionImages[1] =	new Array("bg-header-imagery-03.jpg");
		sectionImages[2] =	new Array("bg-header-imagery-04.jpg");
		sectionImages[3] =	new Array("bg-header-imagery-05.jpg","bg-header-imagery-06.jpg");
		sectionImages[4] =	new Array("bg-header-imagery-07.jpg","bg-header-imagery-08.jpg");
		sectionImages[5] =	new Array("bg-header-imagery-09.jpg","bg-header-imagery-10.jpg");
		sectionImages[6] =	new Array("bg-header-imagery-11.jpg","bg-header-imagery-12.jpg");
		sectionImages[7] =	new Array("bg-header-imagery-13.jpg","bg-header-imagery-14.jpg");
		sectionImages[8] =	new Array("bg-header-imagery-15.jpg","bg-header-imagery-16.jpg");
		var sectionIndex = 0;
		for (var i=0;i<sectionNames.length;i++) {
			if(sectionNames[i] == $('body').attr('class')){
				sectionIndex = i;
				break;
			}
		}
		var sectionImageIndex = Math.floor(Math.random()*sectionImages[sectionIndex].length);
		var sectionImageFile = sectionImages[sectionIndex][sectionImageIndex];
		header.attr("style","background-image:url(" + filePath + sectionImageFile + ");");
	}
};


// Initialise methods onto Frontend Object ================
var Frontend = {
	AlphaList:AlphaList,
	FindAService:FindAService,
	Datepicker:Datepicker,
	FieldsetSubmit:FieldsetSubmit,
	HeaderImagery:HeaderImagery
};
