﻿/*
 * PerpetuumMobile JavaScript Library v0.1
 * http://www.perpetuum.hr/
 *
 * Copyright (c) 2009 Perpetuum Mobile
 *
 * Author:		Tomislav Mesic
 * Date:		2009-12-08 10:08
 * Revision:	4
 */

//	define perpetuum mobile pm namespace
var pm = {};

pm.utils = {};
pm.page = {
	masterSmartTemplate: '',
	cryptographyIncluded: false,
	formCaptchaIncluded: false,
	formValidationIncluded: false
};

pm.iSite = {};
pm.iSite.article = {};
pm.iSite.sectionTree = {};
pm.iSite.sectionFirstLevel = {};
pm.iSite.link = {};
pm.iSite.calendar = {};
pm.iSite.search = {};
pm.iSite.forum = {};
pm.iSite.tag = {};
pm.iSite.form = {};
pm.iSite.image = {};

/*************************************/
/********** utils functions **********/
/*************************************/

/*	
*	purpose:	Common regularexpression match function 
*
*	sample:			
*/	
pm.utils.regexp = function (regex, string) {
	var myregexp, match, result;
	
	myregexp = regex;
	match = myregexp.exec(string); 
	
	if (match !== null) {
		result = match[1];
	} else {
		result = "";
	}

	return result;
};

/*	
*	purpose:	Friendly date helper function 
*
*	sample:		var yearAndMonth = pm.utils.date.year + "." . pm.utils.date.month	// return 2010.8
*/	
pm.utils.date = function () {
	var date, oDate;
	
	date = new Date();
	
	oDate = {
		year: (date.getYear() < 1000) ? date.getYear() + 1900 : date.getYear(),
		month: date.getMonth() + 1,
		monthDay: date.getDate(),
		weekDay: date.getDay()
	};
	
	return oDate;
};

/*	
*	purpose:
*
*	sample:	
*				var l = loc('http://www.net.tutsplus.edu?key=value#hash');
*
*				alert(l.hash()); // http://www.net.tutsplus.com
*				alert(l.protocol()); // http:
*/
pm.utils.splitQueryString = function (url) {
	return {
		search : function () {
			return url.match(/\?(.+)/i)[1];
		},
		hash : function () {
			return url.match(/#(.+)/i)[1];
		},
		protocol : function () {
			return url.match(/(ht|f)tps?:/)[0];
		},
		href : function () {
			return url.match(/(.+\.[a-z]{2,4})/ig);
		}
	};
};

/*	
*	purpose:	Parse and decode query strings 
*				based on http://safalra.com/web-design/javascript/parsing-query-strings/	
*
*	sample:	
*				
*/
pm.utils.parseQueryString = function (queryString) {

	var result, location, queryComponents;
	
	result = {};
	location = window.location;

	//	if a query string wasn't specified, use the query string from the URI
	if (queryString === undefined) {
		queryString = location.search ? location.search : '';
	}
	
	//	remove the leading question mark from the query string if it is present
	if (queryString.charAt(0) === '?') {
		queryString = queryString.substring(1);
	}
	
	//	replace plus signs in the query string with spaces
	queryString = queryString.replace(/\+/g, ' ');
	
	//	split the query string around ampersands and semicolons
	queryComponents = queryString.split(/[&;]/g);
	
	//	loop over the query string components
	for (var i = 0; i < queryComponents.length; i++) {
	
		//	extract this component's key-value pair
		var keyValuePair, key, value;
		
		keyValuePair = queryComponents[i].split('=');
		key = decodeURIComponent(keyValuePair[0]);
		value = decodeURIComponent(keyValuePair[1]);
		
		//	update the parsed query data with this component's key-value pair
		if (!result[key]) {
			result[key] = [];
		}
		result[key].push((keyValuePair.length === 1) ? '' : value);
	}
	
	return result;
};


/*	
*	purpose:	Replace diacritic characters from string 
*
*	sample:			
*/	
pm.utils.escapeDiacritics = function (str) {
	/*	// ne radi u IE6
	var diacritics = new Array(
		["š", "s"],
		["đ", "d"],
		["č", "c"],
		["ć", "c"],
		["ž", "z"]
	);
	
	for (diacritic in diacritics) {
		var diacriticFrom = "/" + diacritics[diacritic][0] + "/gi";
		str = str.replace(eval(diacriticFrom), diacritics[diacritic][1]);			
	};
	
	return str;
	*/
};

/**************************************/
/********** common functions **********/
/**************************************/
pm.openWindow = function () {
	var args = arguments[0];
	
	if (args !== undefined) {
		//	code goes here	
	}
};

//	return current section id
pm.pmCurrentSectionId = function () {
	if (pmCurrentSectionId !== undefined) {
		return pmCurrentSectionId;
	} else {
		//return pm.utils.regexp(/sec=(\d{1,4})/, navigator.location);
		return pm.utils.parseQueryString().sec;
	}
};


/********************************************/
/********** current page functions **********/
/********************************************/
/*	
*	purpose:
*
*	sample:	
*				pm.page.masterSmartTemplate = "startingfromscratch";
*/
pm.page = {
	smartTemplate : null,
	formValidationIncluded : false,
	formCaptchaIncluded: false,
	cryptographyIncluded: false
};

/*	
*	purpose:
*
*	sample:	
*				pm.page.includeCaptcha();
*/
pm.page.includeCaptcha = function () {
	if (pm.page.masterSmartTemplate) {
		$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.crypt.md5.js", function () {			
			pm.page.cryptographyIncluded = true;
		});
		
		$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.form.captcha.js", function () {			
			pm.page.formCaptchaIncluded = true;
		});
	}
};

/*	
*	purpose:
*
*	sample:	
*				pm.page.includeFormValidation();
*/
pm.page.includeFormValidator = function () {
	if (pm.page.masterSmartTemplate) {
		$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.form.validate.js", function () {			
			pm.page.formValidationIncluded = true;
		});
	}
};

/*	
*	purpose:	Enable google analytics 	
*
*	sample:	
*				pm.page.googleAnalytics("XX-XXXXXX-X");
*/
pm.page.googleAnalytics = function (code) {
	if (pm.page.masterSmartTemplate && code.length > 0) {
		$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.gatracker.js", function () {			
			$.gaTracker(code);
		});
	}
}

//	sample: pm.page.init(homePageInitailization);
pm.page.init = function (opt) {
	return (opt) ? opt.apply() : null;
};

//	sample: pm.page.smoothAnchors();
pm.page.smoothAnchors = function () {
	$("a[href^=#][href!=#]").live("click",function (e) {
		e.preventDefault();
    	$("html,body").animate({"scrollTop": $($(this).attr("href")).offset().top+"px"}); 
	});
};

/********************************************/
/********** common iSite functions **********/
/********************************************/

/********** search functionalities **********/

//	sample: pm.iSite.search.init("#search");
pm.iSite.search.init = function () {
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var selector = (args && args.selector) ? args.selector : "#search, #search-results";
	
	$(selector).each(function () {
		var $search = $(this);						  
	
		var $searchField = $search.find("input:text");
		var $searchButton = $search.find("a.search-button, input:button, input:submit, input:image");
		
		//	Handle if pmSearchDefaultSectionId is not empty
		if (pmSearchDefaultSectionId && pmSearchDefaultSectionId.length > 0) {
			$search.find("input[name$='SearchDefaultSectionID']").val(pmSearchDefaultSectionId);
		}
		
		//	Do search on press enter key	
		$searchField
			.removeAttr("onkeypress")
			.unbind()
			.keypress(function (event) {		   
				if (event.keyCode == 13) {
					if ($searchField.val().length > 0) doSearch();
				}
			});
		
		//	Do search on press link or button
		$searchButton
			.removeAttr("onclick")
			.click(function (event) {
				event.preventDefault();
				
				if ($searchField.val().length > 0) {
					doSearch();
				}
			});	
	});
	
	doSearch = function () {
		var strSearchFieldLocatorValue = $("input:hidden[name$='SearchFormLocator']").val();
			
		if (strSearchFieldLocatorValue !== "") {
			MarkForm("6", "1", strSearchFieldLocatorValue,"");
			window.iSite_SetCacheTrigger(null);
			document.forms[0].submit();
		}
	};
	
};

//	sample: pm.iSite.search.enablePlaceHolder("#search");
pm.iSite.search.enablePlaceHolder = function () {
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var selector = (args && args.selector) ? args.selector : "#search";
	
	if (pmSearchFieldPlaceHolder && pmSearchFieldPlaceHolder.length > 0) {
	
		var $search = $(selector);
		var $searchFields = $search.find("input:text");
		
		$searchFields.each(function () {
			var $searchField = $(this);							
		
			$searchField.data({
				placeholder: pmSearchFieldPlaceHolder
			});
			
			if ($searchField.val().length <= 0) {
				$searchField.val($searchField.data().placeholder).addClass("search-field-blur");	
			}
			
			$searchField.focus(function () {			
				if ($searchField.val() == $searchField.data().placeholder) {
					$searchField.val("").removeClass("search-field-blur");
				}
			});
			
			$searchField.blur(function () {
				if ($searchField.val().length <= 0) {
					$searchField.val($searchField.data().placeholder).addClass("search-field-blur");	
				}
			});
		});
	};
};

//	sample: pm.iSite.search.showResultsNumbers();
pm.iSite.search.showResultsNumbers = function () {
	if (document.getElementById("search-results")) {
		$("#search-results-list").addClass("results-list-numeric");
				
		var currentPage = $("span.search-results-pager-current").text()-1;
		var itemsPerPage = $("#search-results dt").length;
		
		$("#search-results dt").each(function (i) {
			// This is because of IE
			var $number = $("<span/>").addClass("search-item-number");
			//	Ihis is not work in IE
			/*var $number = $("<span/>", {
				class: "search-item-number"				
			});*/
			
			$(this).prepend($number.html(currentPage*itemsPerPage+i+1));
		});
	}
}

//	sample: pm.iSite.search.pagerEfects();
pm.iSite.search.pagerEfects = function () {
	if (document.getElementById("search-results-pager")) {	
		var $pager = $("#search-results-pager");
		var $current = $pager.find("span.search-results-pager-current");
		
		$pager.find("a.search-results-pager-prev").hover(function () {
			$current.prev().toggleClass("page-hover");														  
		}, 
		function () {
			$current.prev().toggleClass("page-hover");
		});
		
		$pager.find("a.search-results-pager-next").hover(function () {
			$current.next().toggleClass("page-hover");														  
		}, 
		function () {
			$current.next().toggleClass("page-hover");
		});
	}
}

//	sample: pm.iSite.search.markSearchTerm();
pm.iSite.search.markSearchTerm = function () {
	$("a").html(function (i,html) {
       return html.replace( /&amp;/gi,'<span class="amp">&amp;</span>');
	});
}


/********** article functionalities **********/

//	sample: pm.isite.article.handlePrintButton(".article-print");
pm.iSite.article.handlePrintButton = function () {
	
	var $printButtons = (arguments.length > 0) ? $(arguments[0]) : $(".article-print");
	
	$printButtons.each(function () {
		var $printButton = $(this);
		
		$printButton.attr("title", $printButton.text());
	});
};

/*	
*	purpose:	Share artcile by mail 	
*
*	sample:		
*				pm.isite.article.handleSendMailButton();
*				or
*				pm.isite.article.handleSendMailButton(".article-send-to-mail");
*/
pm.iSite.article.handleSendMailButton = function () {
	
	var $mailButtons = (arguments.length > 0) ? $(arguments[0]) : $(".article-send-to-mail");
	
	$mailButtons.each(function () {
		var $mailButton = $(this);
		
		var subject = document.title + " - " + $mailButton.parents(".article").find(".article-title:first").text(); 
		
		$mailButton.attr("href", "mailto:?subject=" + subject + "&body=" + encodeURIComponent(window.location.href));
	});
};

/*	
*	purpose:	Share article on Facebook 	
*
*	sample:		
*				pm.isite.article.shahreOnFacebook();
*				or
*				pm.isite.article.shahreOnFacebook(".article-share-to-facebook");
*/
pm.iSite.article.shareOnFacebook = function () {
	
	var $facebookButtons = (arguments.length > 0) ? $(arguments[0]) : $(".article-share-on-facebook");
	
	$facebookButtons.each(function () {
		var $facebookButton = $(this);
		
		var title = document.title + " - " + $facebookButton.parents(".article").find(".article-title:first").text(); 
		
		$facebookButton.attr("target", "_blank").attr("href", "http://www.facebook.com/sharer.php?t=" + encodeURIComponent(title) + "&u=" + encodeURIComponent(window.location.href));
	});
};

/*	
*	purpose:	Share article on Twitter 	
*
*	sample:		
*				pm.isite.article.shahreOnTwitter();
*				or
*				pm.isite.article.shahreOnTwitter(".article-share-on-twitter");
*/
pm.iSite.article.shareOnTwitter = function () {
	
	var $twitterButtons = (arguments.length > 0) ? $(arguments[0]) : $(".article-share-on-twitter");
	
	$twitterButtons.each(function () {
		var $twitterButton = $(this);
		
		var title = document.title + " - " + $twitterButton.parents(".article").find(".article-title:first").text(); 
		
		$twitterButton.attr("target", "_blank").attr("href", "http://twitter.com/home?status=" + encodeURIComponent(title) + encodeURIComponent(" ") + escape(window.location.href));
	});
};

/*	
*	purpose:	Hide first article image container if there is no images in article 	
*
*	sample:		
*			pm.isite.article.handleArticleFirstImage();
*			or
*			pm.isite.article.handleArticleFirstImage({
*				article: ".article",
*				articleImage: ".article-image"
*			});
*/
pm.iSite.article.handleArticleFirstImage = function () {
	
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var $articles = (args && args.article) ? $(args.article) : $(".article");
	var articleImageSelector = (args && args.articleImage) ? args.articleImage : ".article-image";
	
	$articles.each(function () {
		var $article = $(this);
		
		if ($article.find("img").length <= 1) {
			$article.find(articleImageSelector).hide();
		}
	});
};

/********** sectiontree functionalities **********/

/*	sample:	
*	pm.iSite.sectionTree.makeSelected({
*		navigationElement: '.navigation-tree',	//navigation element selector 
*		bubbleUp: true,	//select only current element or all element from bottom to top
*		markerClass: 'selected'
*	});
*/
pm.iSite.sectionTree.makeSelected = function () {	
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var $navigationObjects = (args && args.navigationElement) ? $(args.navigationElement) : $(".navigation-tree");
	var bubbleUp = (args && (args.bubbleUp == true || args.bubbleUp == false)) ? args.bubbleUp : true;
	var markerClass = (args && args.markerClass) ? args.markerClass : "selected";
		
	$navigationObjects.each(function () {
		var $navigationObject = $(this);
	
		$navigationObject.find("a").each(function () {
			var oLink = $(this);
			var linkSectionId = pm.utils.regexp(/sec=(\d{1,4})/, oLink.attr("href"));
			
			var linkSelect = false;
			
			if (linkSectionId.length > 0) {
				linkSelect = linkSectionId === pm.pmCurrentSectionId();
			}
			else {
				linkSelect = $.trim(oLink.text()) === pmCurrentSectionName;
			}
			
			if (linkSelect) {
				if (bubbleUp) {
					oLink.parents('li').addClass(markerClass);
				}
				else {
					oLink.parent('li').addClass(markerClass);		
				}	
			}
		});
	});
};

/*	sample:	
*	pm.iSite.sectionTree.makeSelected({
*		navigationElement: '.first-level-navigation',	//first level navigation element selector 
*		markerClass: 'selected'
*	});
*/
pm.iSite.sectionFirstLevel.makeSelected = function () {	
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var $navigationObjects = (args && args.navigationElement) ? $(args.navigationElement) : $(".first-level-navigation");
	var markerClass = (args && args.markerClass) ? args.markerClass : "selected";
		
	$navigationObjects.each(function () {
		var $navigationObject = $(this);
	
		$navigationObject.find("a").each(function () {
			var oLink = $(this);
			var linkSectionId = pm.utils.regexp(/sec=(\d{1,4})/, oLink.attr("href"));
			
			if (linkSectionId.length > 0) {
				if (linkSectionId == pmTopSectionId) {
					oLink.addClass(markerClass);
				}
			}
			else {
				if ($.trim(oLink.text()).indexOf(pmTopSectionName) > -1) {
					oLink.addClass(markerClass);
				}
			}
			
		});
	});
}; 


/********** links functionalities **********/

/*	description: set links target attribute depending on css class
*
*	sample:	
*	pm.iSite.link.handleLinkTarget({
*		selector: "a.new-window, .new-window a",
*		target: "_blank"
*	});
*
*	pm.iSite.link.handleLinkTarget();
*/
pm.iSite.link.handleLinkTarget = function () {
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var target = (args && args.target) ? args.target : "_blank";
	var selector = (args && args.selector) ? args.selector : ".new-window, .new-window a";
	
	$(selector).attr("target", target);
}


/********** calendar functionalities **********/

/*	sample:	
*	pm.iSite.calendar.init({
*		selector: ".calendar"
*	});
*
*	pm.iSite.calendar.init();
*/
pm.iSite.calendar.init = function () {
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var selector = (args && args.selector) ? args.selector : "div.calendar";
	
	$(selector).find("table, tr, td, a").each(function () {
		$(this).removeAttr("style");
		
		if ($(this).attr("align") != "") {
			$(this).css("text-align", $(this).attr("align"));
		}

	});

	$(selector).find("td.CalendarSelectedDate").removeClass("CalendarSelectedDate").addClass("calendar-day-selected");
	$(selector).find("td.CalendarActiveDate").removeClass("CalendarActiveDate").addClass("calendar-day-active");
}


/********** forum functionalities **********/

//	
pm.iSite.forum.addCaptcha = function () {
	$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.form.captcha.js", function () {			
		var captchalabel = (pmCaptchaLabel) ? pmCaptchaLabel : "Securrity code";
		var captchaImageSrc = decodeURIComponent("designtemplates/" + pm.page.masterSmartTemplate + "/images/captcha/") + captcha.sjcap() + ".jpg";
		
		var test = $("<div class='forum-form-field'><label>" + captchalabel + "</label><input name='txtForumPostCaptcha' type='text' id='txtForumPostCaptcha' class='field-text required captcha' /><div class='field-captcha'><img id='captcha' src='" + captchaImageSrc + "' alt='captcha'/></div></div>");
		
		test.insertAfter($("div.forum-form-field:last"));
	});
};

//
pm.iSite.forum.requiredFields = function () {
	
}

/*	sample:	
*	pm.iSite.forum.charactersLimit ({
*		maximum: 140,		
*		warning: 25,
*	});
*/
pm.iSite.forum.charactersLimit = function () {
	var args = (arguments.length > 0) ? arguments[0] : null;
	
	var opts = (args) ? args : {allowed: 140, warning: 25};
	
	if (pm.page.masterSmartTemplate) {
		$.getScript("designtemplates/" + pm.page.masterSmartTemplate + "/include/scripts/perpetuummobile.form.charcounter.js", function () {			
			$("#forum textarea").charcounter({
				allowed: opts.allowed,
				warning: opts.warning
			});
		});
	}
}


/********** tagcloud and tag results functionalities **********/

/*	
*	purpose: 	Set default tag results section id fo all links into tag cloud. 
*				Variable pmTagDefaultSectionId in head.ascx is required.
*
*	sample:	
*				pm.iSite.tag.setTagResultsSection();
*/
pm.iSite.tag.setTagResultsSection = function () {
	if (pmTagDefaultSectionId && parseInt(pmTagDefaultSectionId)) { 
		$("#tag-cloud a").attr("href", function (i, currentHref) {
			return currentHref.replace(/sec=?[\d]+/gi, "sec=" + pmTagDefaultSectionId); 						  
		});
	}
};


/********** image functionalities **********/

/*	
*	purpose: 	Correct wrong image suorce paths
*				Image suorce paths may be used as lgs.axd or fgs.axd services. Correct is fgs.axd service.
*
*	sample:	
*				pm.iSite.image.correctSrc(image.src);
*/
pm.iSite.image.correctSrc = function (src) {
	return src.replace("lgs.", "fgs.").replace(/t=(\d{1,4})/, "t=1").replace("tms=", "sp=");
};


