/**------------------------------------- BEGIN FILE LINKS -------------------------------------------------*/
/**----- jQuery getFileLinks - FileLinks Optimization -----*/
function getFileLinks(websiteId,pageId,regionId,withArchive,withBookmarks) {
	$('<img src="/images/spinner.gif" id="' + regionId + '-spinner" />').css('position','absolute').appendTo($('#' + regionId + '_fileLinksJS'));
	
	$.ajax({
		type: 'GET',
		cacheResponse: true,
		//cacheResponseTimer: 100000,
		url: 'http://cmsfilelinksservice.sks.com/FileLinksJson.aspx',
		data: 'websiteid='+websiteId+'&pageid=' + pageId + '&regionid=' + regionId,
		contentType: 'application/json; charset=utf-8',
		dataType: 'jsonp',
		success: function (data){ onSuccess(data,regionId,withArchive,withBookmarks);	},
		error: function (error,message){ onError(error,message)}
	});
}

function onSuccess(data,regionId,withArchive,withBookmarks) {
	
	var regionToUpdate = $('#' + regionId + '_fileLinksJS');
	var archiveButtonText = '';
	var _withArchive = false;
	
	var archiveButton = $('<a name="'+ regionId+'_ArchiveHyperLynk" style="text-decoration: underline; cursor: pointer;">' + getText(withArchive) +'</a>');
	initFileLinks(data,regionId,withArchive,regionToUpdate,archiveButton,withBookmarks);
	
}


function onError(error,message) {
	//$("#fileLinksJS").append(statusText);
}

function initFileLinks(fileLinksData,regionId,withArchive,regionToUpdate,archiveButton,withBookmarks){
	
	var displayOptions = fileLinksData.displayOptions;
	var currentUrl = window.location.pathname;
	var endDiv = '</div>';
	var urlEnd = '</a>';
	var fileLinksDiv = '';
	var tempContainer = $('<div/>', {
		id: regionId + '_tempContainer'
	});
	
	/*var paginationContainer = $('<div/>', {
		id: regionId + '_paginationContainer'
		
	});*/
	var paginationContainer = $('<div id="' +regionId+ '_paginationContainer" class="flPagination">' + endDiv + '<br />');
	$(paginationContainer).addClass('flPaginationContainer');
	//withArchive = ((withArchive != null && withArchive == true) ? false : true);
	
	regionToUpdate.empty();
	
	fileLinksDiv = buildFileLinks(regionId,fileLinksData,displayOptions,currentUrl,endDiv,urlEnd,withArchive,withBookmarks);
	
	tempContainer.html(fileLinksDiv).appendTo(regionToUpdate);
	
	if(displayOptions.pageSize != '0'){
		buildPaginator(fileLinksData,paginationContainer,tempContainer,withArchive);
	}
	
	
	
	if(displayOptions.showArchiveLink == 'true'){
		archiveButton.click(function() { 
				withArchive = ((withArchive != null && withArchive == true) ? false : true);
				$(this).text(getText(withArchive));
				fileLinksDiv = buildFileLinks(regionId,fileLinksData,displayOptions,currentUrl,endDiv,urlEnd,withArchive,withBookmarks);
				tempContainer.empty().html(fileLinksDiv);
				if(displayOptions.pageSize != '0'){
					buildPaginator(fileLinksData,paginationContainer,tempContainer,withArchive);
				}
				
				
		}).appendTo(regionToUpdate);
	}
	
	//console.log(fileLinksDiv);
}

function buildPaginator(fileLinksData,paginationContainer,tempContainer,withArchive){
	var totalItems = getTotalItems(fileLinksData.fileLinks,withArchive);
	var itemsPerPage = parseInt(getItemsPerPage(fileLinksData.displayOptions.pageSize));
	
	$(paginationContainer).smartpaginator({
	totalrecords: totalItems,
	recordsperpage: itemsPerPage,
	datacontainer: $(tempContainer).attr('id'),
	dataelement: ['.flCatContainer','.fileLink'],
	display: 'single',
	length: 10,
	theme: 'blue'
	/*next: '>',
	prev: '<',
	first: '<<',
	last: '>>'*/
	}).appendTo(tempContainer);
}




function buildFileLinks(regionId,fileLinksData,displayOptions,currentUrl,endDiv,urlEnd,withArchive,withBookmarks){
	
	var fileLinksDiv = '';
	fileLinksDiv += buildFileLinksHeader(regionId,fileLinksData,withBookmarks);
	fileLinksDiv += buildFileLinksBody(fileLinksData,currentUrl,endDiv,urlEnd,withArchive);
	fileLinksDiv += buildFileLinksFooter(endDiv,regionId,displayOptions);
	return fileLinksDiv;
}

function buildFileLinksHeader(regionId,fileLinksData,withBookmarks){
	
	var fileLinksDiv = '';
	if(withBookmarks != null && withBookmarks == true){
		fileLinksDiv += buildBookmarksTable(fileLinksData);
	}
	fileLinksDiv += '<div id="'+ regionId+'_FileLinksMainPanel">'; //ASP.NET Main Panel
	fileLinksDiv += '<div id="_' + regionId + '" class="hidden" style="overflow:hidden;">';
	fileLinksDiv += '<span id="'+regionId+'Panel"></span>';
	fileLinksDiv += '<div id="_' + regionId + '_cId">';
	fileLinksDiv += '<div id="_'+regionId+'_MainPanel" class="flMainContainer">';
	fileLinksDiv += '<div id ="_'+regionId+'_MainFlContainer" class="flContainer">';
	return fileLinksDiv;
}

function buildFileLinksBody(fileLinksData,currentUrl,endDiv,urlEnd,withArchive){
	
	var fileLinksDiv = '';
	if(fileLinksData.displayOptions.displayRss == 'true'){
		fileLinksDiv += '<div style="clear: both;"><a title="RSS2.0" href="RssService.ashx?Id=' + fileLinksData.fileLinksComponentId +'" style="float:right;"><img src="http://realcms3.sks.com/images/rss/rssicon.png" />' + urlEnd  + endDiv;
		fileLinksDiv +='<div>&nbsp;</div>';
	}
	
	/** GET SORT ORDER (FIELD,ORDER)**/
	var sortOrder = getSortOrder(fileLinksData.displayOptions.sortOrder);
	
	
	for(var i =0; i < fileLinksData.fileLinks.length; i++){
		
		var fileLinksCategory =  fileLinksData.fileLinks[i].fileLinkCategory;
		if(fileLinksCategory.fileLinksArray.length > 0){
			
			fileLinksDiv += getCategory(fileLinksCategory,fileLinksData.displayOptions,endDiv);
			/** ARRAY SORT **/
			sortData(fileLinksCategory.fileLinksArray,sortOrder);
			/**------------**/
			if(withArchive != null && withArchive == true){
				fileLinksDiv += getAllFileLinks(fileLinksData.fileLinks[i].fileLinkCategory.fileLinksArray,fileLinksData.displayOptions,currentUrl,endDiv,urlEnd);
			}else{
				fileLinksDiv += getOnlyUnArchivedFileLinks(fileLinksData.fileLinks[i].fileLinkCategory.fileLinksArray,fileLinksData.displayOptions,currentUrl,endDiv,urlEnd);
			}
			
			
		}
	}
	return fileLinksDiv
}

function sortData(fileLinksArray,sortOrder){
	
	switch(sortOrder.type){
		case 'date':
			if(sortOrder.order == 'newToOld'){
				fileLinksArray.sort(sortDateNewToOld);
			}else if(sortOrder.order == 'oldToNew'){
				fileLinksArray.sort(sortDateOldToNew);
			}
			break;
		case 'title':
			if(sortOrder.order == 'ascending'){
				fileLinksArray.sort(sortTitleAscending);
			}else if(sortOrder.order == 'descending'){
				fileLinksArray.sort(sortTitleDescending);
			}
		
			break;
	}
	
}

function getSortOrder(sortOrderNumber){
	var sortOrder = {};
	switch(sortOrderNumber){
		case '0':
			sortOrder.type = 'none';
			sortOrder.order = 'none'
			break;
		case '1':
			sortOrder.type = 'date';
			sortOrder.order = 'newToOld'
			break;
		case '2':
			sortOrder.type = 'date';
			sortOrder.order = 'oldToNew'
			break;
		case '3':
			sortOrder.type = 'title';
			sortOrder.order = 'ascending'
			break;
		case '4':
			sortOrder.type = 'title';
			sortOrder.order = 'descending'
			break;
	}
	
	return sortOrder
}



/** SORTING FUNCTIONS **/
function sortDateNewToOld(aObject,bObject){
	if(aObject.fileLink.date < bObject.fileLink.date) {
		return 1;
	}else if(aObject.fileLink.date > bObject.fileLink.date){
		return -1;
	}
	return 0;
}

function sortDateOldToNew(aObject,bObject){
	if(aObject.fileLink.date > bObject.fileLink.date) {
		return 1;
	}else if(aObject.fileLink.date < bObject.fileLink.date){
		return -1;
	}
	return 0;
}

function sortTitleAscending(aObject,bObject){
	if(aObject.fileLink.title.toLowerCase() > bObject.fileLink.title.toLowerCase()) {
		return 1;
	}else if(aObject.fileLink.title.toLowerCase() < bObject.fileLink.title.toLowerCase()){
		return -1;
	}
	return 0;
}

function sortTitleDescending(aObject,bObject){
	if(aObject.fileLink.title.toLowerCase() < bObject.fileLink.title.toLowerCase()) {
		return 1;
	}else if(aObject.fileLink.title.toLowerCase() > bObject.fileLink.title.toLowerCase()){
		return -1;
	}
	return 0;
}


/** END SORTING FUNCTIONS **/
function buildFileLinksFooter(endDiv,regionId,displayOptions){
	
	var fileLinksDiv = '';
	fileLinksDiv += endDiv; //flContainer
	fileLinksDiv += endDiv; //flMainContainer
	fileLinksDiv += '<span disabled="disabled"></span>';
	fileLinksDiv += '<div class="flArchiveContainer"></div>';
	fileLinksDiv += endDiv; //componentId div
	fileLinksDiv += endDiv; //hidden div
	fileLinksDiv += endDiv; //MainPanel
	return fileLinksDiv;
}

function getCategory(fileLinksCategory,displayOptions,endDiv,withBookmarks){
	var fileLinksDiv = '';
	fileLinksDiv +='<div class="flCatContainer">';	
	if(displayOptions.displayCategoryTitle == 'true')
	{
		if(fileLinksCategory.title != null && fileLinksCategory.title != '')
		{
			if(withBookmarks == true){
				fileLinksDiv += '<div class="flCatTitle">' + strDecode('<a name="' +fileLinksCategory.title + '">' +fileLinksCategory.title + '</a>') +  endDiv;
			}else{
				fileLinksDiv += '<div class="flCatTitle">' +strDecode(fileLinksCategory.title) + endDiv;
			}
		}
	}
	if(displayOptions.displayCategoryDescription == 'true')
	{
		if(fileLinksCategory.description != null && fileLinksCategory.description != '')
		{
			fileLinksDiv += '<div class="flCatDescription">' +strDecode(fileLinksCategory.description)+ endDiv;
		}
	}
	fileLinksDiv += endDiv;
	return fileLinksDiv;
}


function getAllFileLinks(fileLinksArray,displayOptions,currentUrl,endDiv,urlEnd){
	var fileLinksDiv = '';
	console.log('getAllFileLinks');
	for(var j = 0; j < fileLinksArray.length; j++)
	{
		var fileLink = fileLinksArray[j].fileLink;
		if (fileLink.active == 'true') {
			fileLinksDiv += buildFileLink(fileLink,displayOptions,currentUrl,endDiv,urlEnd);
		}
	}
	
	return fileLinksDiv;
}


function getOnlyUnArchivedFileLinks(fileLinksArray,displayOptions,currentUrl,endDiv,urlEnd){
	var fileLinksDiv = '';
	
	for(var j = 0; j < fileLinksArray.length; j++)
	{
		
		var fileLink = fileLinksArray[j].fileLink;
		if (fileLink.active == 'true') {
			
			if(fileLink.isArchived == 'false'){
				
				fileLinksDiv += buildFileLink(fileLink,displayOptions,currentUrl,endDiv,urlEnd);
			}
		}
	}
	return fileLinksDiv;
}

function buildFileLink(fileLink,displayOptions,currentUrl,endDiv,urlEnd){
	var fileLinksDiv = '';
	var fileLinkNavigateUrlStart = '<a href="' + resolveFileLinkUrl(fileLink) + '"';
	fileLinksDiv += '<div class="fileLink">';
	if (displayOptions.openLinksInNewWindow == 'true') {
		fileLinkNavigateUrlStart += ' target="_blank"';
	} else {
		fileLinkNavigateUrlStart += ' target="_self"';
	}

	fileLinkNavigateUrlStart += '>';
	
	if (displayOptions.displayShareButton == 'true') {
		fileLinksDiv += '<div style="float: right;"><a class="addthis_button" href="http://addthis.com/bookmark.php?v=250&amp;username=xa-4b885da765555e27" addthis:url="' + currentUrl +'?fileLinksId=' + fileLink.fileLinkId + '" addthis:title="' + fileLink.title+ '"><img src="http://s7.addthis.com/static/btn/sm-share-en.gif" width="83" height="16" alt="Bookmark and Share" style="border:0"/>' + urlEnd + endDiv;
	 }
	
	

	if (displayOptions.displayDate == 'true') {
		if (fileLink.date != null && fileLink.date != '') {
			fileLinksDiv += '<div class="flDate">' + fileLinkNavigateUrlStart + $.format.date(fileLink.date, displayOptions.displayDateFormat) + urlEnd + endDiv;			
		}
	}

	if (displayOptions.displayTitle == 'true') {
		if (fileLink.title != null && fileLink.title != '') {
			fileLinksDiv += '<div class="flTitle">' + strDecode(fileLinkNavigateUrlStart + fileLink.title + urlEnd) + endDiv;
		}
	}

	if (displayOptions.displayAuthor == 'true') {
		if (fileLink.author != null && fileLink.author != '') {
			fileLinksDiv += '<div class="flAuthor">' + strDecode(fileLink.author) + endDiv;
		}
	}

	if (displayOptions.displayDescription == 'true') {
		if (fileLink.description != null && fileLink.description != '') {
			fileLinksDiv += '<div class="flDescription">' + strDecode(fileLink.description) + endDiv;
		}
	}
	if (displayOptions.showLineSeparator == 'true') {
		fileLinksDiv += '<div class="flHrDiv"><hr class="flHR"/>' + endDiv;
	}
	fileLinksDiv += endDiv;
	return fileLinksDiv;
}

function resolveFileLinkUrl(fileLink){
	var fileLinkUrl = '';
	if(fileLink.urlSchema == 'local://'){
		if(fileLink.urlResource.charAt(0) == '/'){
			fileLinkUrl = getBaseURL() + fileLink.urlResource.substring(1);
		}else{
			fileLinkUrl = '/' + fileLink.urlResource;
		}
	}else{
		fileLinkUrl = fileLink.urlSchema +fileLink.urlResource;
	}
	
	
	return fileLinkUrl;
}

function getText(withArchive){
	var returnText = '';
	if(withArchive != null && withArchive == true){
		returnText = 'Hide Archive';
	}else{
		returnText = 'Show Archive';
	}
	return returnText;
}

function buildBookmarksTable(fileLinksData){
	var bookmarksTable = '';
	bookmarksTable += '<div style="text-align: center;">'
	for(var i = 0; i < fileLinksData.fileLinks.length; i++){
		var fileLinksCategory =  fileLinksData.fileLinks[i].fileLinkCategory;		
		if(fileLinksCategory.fileLinksArray.length > 0){
			bookmarksTable += '<a href="#' + fileLinksCategory.title + '" class="flBookmarks">' + fileLinksCategory.title + '</a>&nbsp;';
		}
	}
	bookmarksTable += '</div><br />'
	return bookmarksTable;
}

/** BEGIN HELPER FUNCTIONS **/
function strDecode(str) {
    return decodeURIComponent((str + '').replace(/\+/g, '%20'))
}
/** END HELPER FUNCTIONS **/
/** Begin Pagination **/
function initPagination(fileLinksData,withArchive,paginationContainer,tempContainer,regionId){
	var containerName = '#_' +regionId+ '_MainFlContainer ';
	var itemsPerPage = getItemsPerPage(fileLinksData.displayOptions.pageSize);
	//var totalItems = (($(containerName + '.flCatContainer' ).length) + ($(containerName + '.fileLink' ).length));
	var totalItems = getTotalItems(fileLinksData.fileLinks,withArchive);
	var paginationContainerBreakLine = $('<br/><br/>');
	paginationContainerBreakLine.appendTo(paginationContainer);
	paginationContainer.appendTo(tempContainer);
	/*$(paginationContainer).smartpaginator({
		totalrecords: totalItems,
		recordsperpage: itemsPerPage,
		datacontainer: $(tempContainer).attr('id'),
		dataelement: ['.flCatContainer','.fileLink']
	 });*/
}


function getTotalItems(fileLinks,withArchive){
	var totalItems = 0;
	var totalCategories = 0;
	var itemsPerCategory =0;
	for(var i = 0; i< fileLinks.length; i++)
	{
		var fileLinksCategory =  fileLinks[i].fileLinkCategory;
		if(fileLinksCategory.fileLinksArray.length > 0){
			var fileLinksArray = fileLinksCategory.fileLinksArray;
			if(withArchive == true){
				itemsPerCategory += fileLinksArray.length;
			}else{
				itemsPerCategory +=getUnArchivedFileLinksPerCategory(fileLinksArray);
			}
			totalCategories++;
		}
	}
	totalItems = itemsPerCategory + totalCategories;
	
	return totalItems;
}

function getUnArchivedFileLinksPerCategory(fileLinksArray){
	var items = 0;
	for(var j =0; j < fileLinksArray.length;j++)
	{
		if(fileLinksArray[j].fileLink.active == 'true'){
			if(fileLinksArray[j].fileLink.isArchived == 'false'){
				items++;
			}
		}
	}
	return items;
}

function getItemsPerPage(pageSize){
	var itemsPerPage = '0';
	switch(pageSize){
		case '1':
			itemsPerPage = '10';
		break;
		case '2':
			itemsPerPage = '20';
		break;
		case '3':
			itemsPerPage = '50';
		break;
		case '4':
			itemsPerPage = '100';
		break;
	}
	return itemsPerPage;
}

/** End Pagination **/
/** Utility function **/

function getBaseURL() {
    var url = location.href;  // entire url including querystring - also: window.location.href;
    var baseURL = url.substring(0, url.indexOf('/', 14));


    if (baseURL.indexOf('http://localhost') != -1) {
        // Base Url for localhost
        var url = location.href;  // window.location.href;
        var pathname = location.pathname;  // window.location.pathname;
        var index1 = url.indexOf(pathname);
        var index2 = url.indexOf("/", index1 + 1);
        var baseLocalUrl = url.substr(0, index2);

        return baseLocalUrl + "/";
    }
    else {
        // Root Url for domain name
        return baseURL + "/";
    }

}
/** DATE FORMAT FUNCTIONS **/
(function ($) {
		
		var daysInWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
		var shortMonthsInYear = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
		var longMonthsInYear = ["January", "February", "March", "April", "May", "June", 
														"July", "August", "September", "October", "November", "December"];
		var shortMonthsToNumber = [];
		shortMonthsToNumber["Jan"] = "01";
		shortMonthsToNumber["Feb"] = "02";
		shortMonthsToNumber["Mar"] = "03";
		shortMonthsToNumber["Apr"] = "04";
		shortMonthsToNumber["May"] = "05";
		shortMonthsToNumber["Jun"] = "06";
		shortMonthsToNumber["Jul"] = "07";
		shortMonthsToNumber["Aug"] = "08";
		shortMonthsToNumber["Sep"] = "09";
		shortMonthsToNumber["Oct"] = "10";
		shortMonthsToNumber["Nov"] = "11";
		shortMonthsToNumber["Dec"] = "12";
	
    $.format = (function () {
        function strDay(value) {
 						return daysInWeek[parseInt(value, 10)] || value;
        }

        function strMonth(value) {
						var monthArrayIndex = parseInt(value, 10) - 1;
 						return shortMonthsInYear[monthArrayIndex] || value;
        }

        function strLongMonth(value) {
					var monthArrayIndex = parseInt(value, 10) - 1;
					return longMonthsInYear[monthArrayIndex] || value;					
        }

        var parseMonth = function (value) {
					return shortMonthsToNumber[value] || value;
        };

        var parseTime = function (value) {
                var retValue = value;
                var millis = "";
                if (retValue.indexOf(".") !== -1) {
                    var delimited = retValue.split('.');
                    retValue = delimited[0];
                    millis = delimited[1];
                }

                var values3 = retValue.split(":");

                if (values3.length === 3) {
                    hour = values3[0];
                    minute = values3[1];
                    second = values3[2];

                    return {
                        time: retValue,
                        hour: hour,
                        minute: minute,
                        second: second,
                        millis: millis
                    };
                } else {
                    return {
                        time: "",
                        hour: "",
                        minute: "",
                        second: "",
                        millis: ""
                    };
                }
            };

        return {
            date: function (value, format) {
                /* 
					value = new java.util.Date()
                 	2009-12-18 10:54:50.546 
				*/
                try {
                    var date = null;
                    var year = null;
                    var month = null;
                    var dayOfMonth = null;
                    var dayOfWeek = null;
                    var time = null;
                    if (typeof value.getFullYear === "function") {
                        year = value.getFullYear();
                        month = value.getMonth() + 1;
                        dayOfMonth = value.getDate();
                        dayOfWeek = value.getDay();
                        time = parseTime(value.toTimeString());
										} else if (value.search(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[-+]?\d{2}:?\d{2}/) != -1) { /* 2009-04-19T16:11:05+02:00 */											
                        var values = value.split(/[T\+-]/);
                        year = values[0];
                        month = values[1];
                        dayOfMonth = values[2];
                        time = parseTime(values[3].split(".")[0]);
                        date = new Date(year, month - 1, dayOfMonth);
                        dayOfWeek = date.getDay();
                    } else {
                        var values = value.split(" ");
                        switch (values.length) {
						case 1:
							var values2 = value.split("-");
							year = values2[0];
							month = values2[1];
							var values3 = values2[2].split("T");
							dayOfMonth = values3[0];
							date = new Date(year, month - 1, dayOfMonth);
                            dayOfWeek = date.getDay();
							break;
                        case 6:
                            /* Wed Jan 13 10:43:41 CET 2010 */
                            year = values[5];
                            month = parseMonth(values[1]);
                            dayOfMonth = values[2];
                            time = parseTime(values[3]);
                            date = new Date(year, month - 1, dayOfMonth);
                            dayOfWeek = date.getDay();
                            break;
                        case 2:
                            /* 2009-12-18 10:54:50.546 */
                            var values2 = values[0].split("-");
                            year = values2[0];
                            month = values2[1];
                            dayOfMonth = values2[2];
                            time = parseTime(values[1]);
                            date = new Date(year, month - 1, dayOfMonth);
                            dayOfWeek = date.getDay();
                            break;
                        case 7:
                            /* Tue Mar 01 2011 12:01:42 GMT-0800 (PST) */
                        case 9:
                            /*added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0800 (China Standard Time) */
                        case 10:
                            /* added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0200 (W. Europe Daylight Time) */
                            year = values[3];
                            month = parseMonth(values[1]);
                            dayOfMonth = values[2];
                            time = parseTime(values[4]);
                            date = new Date(year, month - 1, dayOfMonth);
                            dayOfWeek = date.getDay();
                            break;
                        default:
                            return value;
                        }
                    }

                    var pattern = "";
                    var retValue = "";
                    /*
						Issue 1 - variable scope issue in format.date 
                    	Thanks jakemonO
					*/
					/*
						Little tweak: 
						format: "dddd, MMMM d, yyyy" should comply to: "ddd, MMMM d, yyyy"
					*/
					if(format == "dddd, MMMM d, yyyy"){
						format = "ddd, MMMM d, yyyy";
					}
                    for (var i = 0; i < format.length; i++) {
                       
						var currentPattern = format.charAt(i);
                        pattern += currentPattern;
                        switch (pattern) {
						case "ddd":
                            retValue += strDay(dayOfWeek);
                            pattern = "";
                            break;
                        case "d":
						case "dd":
                            if (format.charAt(i + 1) == "d") {
                                break;
                            }
                            if (String(dayOfMonth).length === 1) {
                                dayOfMonth = '0' + dayOfMonth;
                            }
                            retValue += dayOfMonth;
                            pattern = "";
                            break;
                        case "MMMM":
                            retValue += strLongMonth(month);
                            pattern = "";
                            break;
                        case "MMM":
                            if (format.charAt(i + 1) === "M") {
                                break;
                            }
                            retValue += strMonth(month);
                            pattern = "";
                            break;
						case "M":	
                        case "MM":
                            if (format.charAt(i + 1) == "M") {
                                break;
                            }
                            if (String(month).length === 1) {
                                month = '0' + month;
                            }
                            retValue += month;
                            pattern = "";
                            break;
                        case "yyyy":
                            retValue += year;
                            pattern = "";
                            break;
                        case "yy":
                            if (format.charAt(i + 1) == "y" &&
                           	format.charAt(i + 2) == "y") {
                            	break;
                      	    }
                            retValue += String(year).slice(-2);
                            pattern = "";
                            break;
                        case "HH":
                            retValue += time.hour;
                            pattern = "";
                            break;
                        case "hh":
                            /* time.hour is "00" as string == is used instead of === */
                            var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12);
                            hour = String(hour).length == 1 ? '0'+hour : hour;
                            retValue += hour;
                            pattern = "";
                            break;
												case "h":
												    if (format.charAt(i + 1) == "h") {
												        break;
												    }
												    var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12);                           
												    retValue += hour;
												    pattern = "";
												    break;
                        case "mm":
                            retValue += time.minute;
                            pattern = "";
                            break;
                        case "ss":
                            /* ensure only seconds are added to the return string */
                            retValue += time.second.substring(0, 2);
                            pattern = "";
                            break;
                        case "SSS":
                            retValue += time.millis.substring(0, 3);
                            pattern = "";
                            break;
                        case "a":
                            retValue += time.hour >= 12 ? "PM" : "AM";
                            pattern = "";
                            break;
                        case " ":
                            retValue += currentPattern;
                            pattern = "";
                            break;
                        case "/":
                            retValue += currentPattern;
                            pattern = "";
                            break;
                        case ":":
                            retValue += currentPattern;
                            pattern = "";
                            break;
                        default:
                            if (pattern.length === 2 && pattern.indexOf("y") !== 0 && pattern != "SS") {
                                retValue += pattern.substring(0, 1);
                                pattern = pattern.substring(1, 2);
                            } else if ((pattern.length === 3 && pattern.indexOf("yyy") === -1)) {
                                pattern = "";
                            }
                        }
                    }
                    return retValue;
                } catch (e) {
                    console.log(e);
                    return value;
                }
            }
        };
    }());
}(jQuery));
/** END DATE FORMAT FUNCTIONS **/
/** BEGIN SMART PAGINATOR **/
(function($) {
    $.fn.extend({
        smartpaginator: function(options) {
            var settings = $.extend({
                totalrecords: 0,
                recordsperpage: 0,
                length: 10,
                next: 'Next',
                prev: 'Prev',
                first: 'First',
                last: 'Last',
                go: 'Go',
                theme: 'green',
                display: 'double',
                initval: 1,
                datacontainer: '', //data container id
                dataelement: '', //children elements to be filtered e.g. tr or div
                onchange: null
            }, options);
            return this.each(function() {
                var currentPage = 0;
                var startPage = 0;
                var totalpages = parseInt(settings.totalrecords / settings.recordsperpage);
                if (settings.totalrecords % settings.recordsperpage > 0) totalpages++;
                var initialized = false;
                var container = $(this).addClass('pager').addClass(settings.theme);
                container.find('ul').remove();
                container.find('div').remove();
                container.find('span').remove();
                var dataContainer;
                var dataElements;
                if (settings.datacontainer != '') {
                    dataContainer = $('#' + settings.datacontainer);
                    dataElements = $('' + settings.dataelement + '', dataContainer);
                }
                var list = $('<ul/>');
                var btnPrev = $('<div/>').text(settings.prev).click(function() { currentPage = parseInt(list.find('li a.active').text()) - 1; navigate(--currentPage); }).addClass('btn');
                var btnNext = $('<div/>').text(settings.next).click(function() { currentPage = parseInt(list.find('li a.active').text()); navigate(currentPage); }).addClass('btn');
                var btnFirst = $('<div/>').text(settings.first).click(function() { currentPage = 0; navigate(0); }).addClass('btn');
                var btnLast = $('<div/>').text(settings.last).click(function() { currentPage = totalpages - 1; navigate(currentPage); }).addClass('btn');
                var inputPage = $('<input/>').attr('type', 'text').keydown(function(e) {
                    if (isTextSelected(inputPage)) inputPage.val('');
                    if (e.which >= 48 && e.which < 58) {
                        var value = parseInt(inputPage.val() + (e.which - 48));
                        if (!(value > 0 && value <= totalpages)) e.preventDefault();
                    } else if (!(e.which == 8 || e.which == 46)) e.preventDefault();
                });
                var btnGo = $('<input/>').attr('type', 'button').attr('value', settings.go).addClass('btn').click(function() { if (inputPage.val() == '') return false; else { currentPage = parseInt(inputPage.val()) - 1; navigate(currentPage); } });
                container.append(btnFirst).append(btnPrev).append(list).append(btnNext).append(btnLast).append($('<div/>').addClass('short').append(inputPage).append(btnGo));
                if (settings.display == 'single') {
                    btnGo.css('display', 'none');
                    inputPage.css('display', 'none');
                }
                buildNavigation(startPage);
                if (settings.initval == 0) settings.initval = 1;
                currentPage = settings.initval - 1;
                navigate(currentPage);
                initialized = true;
                function showLabels(pageIndex) {
                    container.find('span').remove();
                    var upper = (pageIndex + 1) * settings.recordsperpage;
                    if (upper > settings.totalrecords) upper = settings.totalrecords;
                    container.append($('<span/>').append($('<b/>').text(pageIndex * settings.recordsperpage + 1)))
                                             .append($('<span/>').text('-'))
                                             .append($('<span/>').append($('<b/>').text(upper)))
                                             .append($('<span/>').text('of'))
                                             .append($('<span/>').append($('<b/>').text(settings.totalrecords)));
                }
                function buildNavigation(startPage) {
                    list.find('li').remove();
                    if (settings.totalrecords <= settings.recordsperpage) return;
                    for (var i = startPage; i < startPage + settings.length; i++) {
                        if (i == totalpages) break;
                        list.append($('<li/>')
                                    .append($('<a>').attr('id', (i + 1)).addClass(settings.theme).addClass('normal')
                                    .attr('href', 'javascript:void(0)')
                                    .text(i + 1))
                                    .click(function() {
                                        currentPage = startPage + $(this).closest('li').prevAll().length;
                                        navigate(currentPage);
                                    }));
                    }
                    showLabels(startPage);
                    inputPage.val((startPage + 1));
                    list.find('li a').addClass(settings.theme).removeClass('active');
                    list.find('li:eq(0) a').addClass(settings.theme).addClass('active');
                    showRequiredButtons(startPage);
                }
                function navigate(topage) {
                    //make sure the page in between min and max page count
                    var index = topage;
                    var mid = settings.length / 2;
                    if (settings.length % 2 > 0) mid = (settings.length + 1) / 2;
                    var startIndex = 0;
                    if (topage >= 0 && topage < totalpages) {
                        if (topage >= mid) {
                            if (totalpages - topage > mid)
                                startIndex = topage - (mid - 1);
                            else if (totalpages > settings.length)
                                startIndex = totalpages - settings.length;
                        }
                        buildNavigation(startIndex); showLabels(currentPage);
                        list.find('li a').removeClass('active');
                        inputPage.val(currentPage + 1);
                        list.find('li a[id="' + (index + 1) + '"]').addClass('active');
                        var recordStartIndex = currentPage * settings.recordsperpage;
                        var recordsEndIndex = recordStartIndex + settings.recordsperpage;
                        if (recordsEndIndex > settings.totalrecords)
                            recordsEndIndex = settings.totalrecords % recordsEndIndex;
                        if (initialized) {
                            if (settings.onchange != null) {
                                settings.onchange((currentPage + 1), recordStartIndex, recordsEndIndex);
                            }
                        }
                        if (dataContainer != null) {
                            if (dataContainer.length > 0) {
                                //hide all elements first
                                dataElements.css('display', 'none');
                                //display elements that need to be displayed
                                if ($(dataElements[0]).find('th').length > 0) { //if there is a header, keep it visible always
                                    $(dataElements[0]).css('display', '');
                                    recordStartIndex++;
                                    recordsEndIndex++;
                                }
                                for (var i = recordStartIndex; i < recordsEndIndex; i++)
                                    $(dataElements[i]).css('display', '');
                            }
                        }

                        showRequiredButtons();
                    }
                }
                function showRequiredButtons() {
                    if (totalpages > settings.length) {
                        if (currentPage > 0) { btnPrev.css('display', ''); }
                        else { btnPrev.css('display', 'none'); }
                        if (currentPage > settings.length / 2 - 1) { btnFirst.css('display', ''); }
                        else { btnFirst.css('display', 'none'); }

                        if (currentPage == totalpages - 1) { btnNext.css('display', 'none'); }
                        else btnNext.css('display', '');
                        if (totalpages > settings.length && currentPage < (totalpages - (settings.length / 2)) - 1) { btnLast.css('display', ''); }
                        else { btnLast.css('display', 'none'); };
                    }
                    else {
                        btnFirst.css('display', 'none');
                        btnPrev.css('display', 'none');
                        btnNext.css('display', 'none');
                        btnLast.css('display', 'none');
                    }
                }
                function isTextSelected(el) {
                    var startPos = el.get(0).selectionStart;
                    var endPos = el.get(0).selectionEnd;
                    var doc = document.selection;
                    if (doc && doc.createRange().text.length != 0) {
                        return true;
                    } else if (!doc && el.val().substring(startPos, endPos).length != 0) {
                        return true;
                    }
                    return false;
                }
            });
        }
    });
})(jQuery);
/** END SMART PAGINATOR **/
/** END FILE LINKS OPTIMIZATION **/


