﻿// prototype //
Function.prototype.method = function(name, func) {
	if (!this.prototype[name]) {
		this.prototype = func;
	}
};
//trim all spaces
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, "");
};
// end prototype //
//IE indexOf
Array.prototype.indexOf = function(obj) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == obj) { return i; }
	}
	return -1;
}

var Jg = {};

Jg.checkEnterKeyPress = function(e, callBack) {
	switch (e.keyCode) {
		case 13:
			callBack();
			break;
		default:
			return false;
			break;
	}
};

Jg.search = function(searchVal) {
	location.href = '/list.aspx?search=' + searchVal;
};

Jg.reconstructTitleLink = function(linkListJqSelector) {
    $(linkListJqSelector).each(function() {
        var curHtml = $(this).html();
        var substringLen = 0;
        var idx = 0;

        for (var i = 0; i < curHtml.length; i++) {
            if (escape(curHtml[i]).length > 1) {
                substringLen += 1;
            } else {
                substringLen += 1.5;
            }
            idx++;
            if (idx === 8) {
                if ($(this).html().length > substringLen) {
                    $(this).html(curHtml.substring(0, substringLen) + '...');
                }
                return;
            }
        }
    });
};

Jg.commentActions = {
	isCommentBoxVisible: true,
	displayCommentBox: function() {
		var actionLink = $('#jg_userComment .commentActionLink');

		if (this.isCommentBoxVisible) {
			document.getElementById('jg_commentBox').style.display = '';
			if (true) {
				$('html, body').animate({ scrollTop:$('#jg_commentBox').offset().top}, 500, function() {
					$('#comment_User').focus();
					actionLink.addClass('commentActionOff');
					Jg.commentActions.isCommentBoxVisible = false;
				});
			}
		} else {
			document.getElementById('jg_commentBox').style.display = 'none';
			if (true) {
				actionLink.removeClass('commentActionOff');
				Jg.commentActions.isCommentBoxVisible = true;
			}
		}
	},
	addComment: function(userName, comment, url) {
		if (userName === "" || comment === "") {
			alert("please enter both name and comment");
			return false;
		}

		$.ajax({
			url: url + '&action=1',
			type: 'get',
			beforeSend: $.blockUI({ message: "please wait...", css: { padding: '25px', color: '#818510'} }),
			data: '&username=' + escape(userName) + '&comment=' + escape(comment),
			error: function() {
				$.unblockUI();
				alert('Error occur!');
			},
			success: function(data) {
				var h = [];
				var currentDateTime = new Date().getTime();
				var commentCountTxt = 0;
				var commentCount = $('#jg_userComment .comment').length;

				h.push('<div class="comment">');
				h.push('<div colspan="2" class="userInfo">'
				        + '<a name="' + currentDateTime + '"></a>'
				        + '<a href="/content/comments.aspx?u=' + escape(userName)
				        + '" class="bodylink"> ' + userName + '</a> (' + data + ')</div>');
				h.push('<div class="commentText">' + comment + '</div>');
				h.push('</div>');

				if (commentCount === 0) {
					commentCountTxt = ' User Comment:';
				} else {
					commentCountTxt = ' User Comments:';
				}

				$('#jg_userComment .head').html((commentCount + 1) + commentCountTxt);
				$('#jg_userComment .commentList').prepend(h.join(''));
				Jg.commentActions.clearField(['#comment_User', '#comment_Text']);
				setTimeout('$.unblockUI()', 1000); //delay one second
				// goto that comment
				window.location = window.location + '#' + currentDateTime;
			}
		});
	},
	clearField: function(jQSelectorArray) {
		for (var i = 0; i < jQSelectorArray.length; i++) {
			$(jQSelectorArray[i]).val('');
		}
		Jg.commentActions.displayCommentBox();
	}
};

Jg.getElementByClass = function(className, obj, elemInArray) {
    var arrElem = elemInArray || [];

    if (obj.className) {
        if (obj.className.indexOf(className) > -1) {
            arrElem.push(obj);
        }
    }
    // find class in childNodes
    for (var i = 0; i < obj.childNodes.length; i++) {
        Jg.getElementByClass(className, obj.childNodes[i], arrElem);
    }
    return arrElem;
};

Jg.isTabBinded = false;

Jg.bindNavTabSet = function(jQselector_StartTab) {

	var mainCat = Jg.getElementByClass('topnavMainType', document.getElementById('TopTabBar'));

	for (var i = 0; i < mainCat.length; i++) {
		mainCat[i].onmouseover = function() {
			$('#TopTabBar .active').removeClass('active');
			$(this).addClass('active');
			$('#categoryTab' + this.id).addClass('active');
		};
	}
	if (!Jg.isTabBinded) {
		$(jQselector_StartTab).trigger('mouseover');
		Jg.isTabBinded = true;
	}
};

Jg.walkTheDom = function(domObj, elemArray) {
	var resultArray = elemArray || [];
	if (domObj.nodeType === 3 && domObj.nodeValue.trim() !== "") {
		resultArray.push(domObj);
	}

	for (var i = 0; i < domObj.childNodes.length; i++) {
		Jg.walkTheDom(domObj.childNodes[i], resultArray);
	}

	return resultArray;
};

Jg.googleTransLateInit = function(contentID, location) {
	//must set before calling translate api
	Jg.userLocation = location;
	Jg.elemToTranslate = document.getElementById(contentID);
	google.setOnLoadCallback(Jg.googleTranslateInitialize);
}

//google translate api
Jg.googleTranslateInitialize = function(languageTo) {
	var textElems = Jg.walkTheDom(Jg.elemToTranslate, []);
	var languageChangeTo = "zh-TW";
	var location = Jg.userLocation;
	var simplifiedLocations = "CN,SG";
	
	google.language.detect(document.getElementById('contentTitle').innerHTML, function(result) {	//detect current language by using title
		var detectedLanguage = result.language;

		if (simplifiedLocations.indexOf(location) > -1) {	// check if user is from China/Singapore
			if (detectedLanguage.indexOf("CN") === -1) {	//check if is alreday simplified
				languageChangeTo = "zh-CN";
			} else {
				return;
			}
		} else {
			if (detectedLanguage === "zh-CN") {	//check if is simplified
				languageChangeTo = "zh-TW"; //if so change it!
			} else {
				return;
			}
		}

		for (var i = 0; i < textElems.length; i++) {
			if (!result.error && result.language) {
				google.language.translate(textElems[i].nodeValue, result.language, languageChangeTo,
                                (function(myI) {
                                	return function(result) {
                                		var translated = textElems[myI];
                                		if (result.translation) {
                                			translated.nodeValue = result.translation;
                                		}
                                	}
                                })(i));
			}
		}
	});
}

Jg.changeLangauge = function(languageURL) {
	location.href = languageURL;
}

/////////////////////////////// under construction ///////////////////////////////////////////////
Jg.bookMark = function(actionArry) {
	var title = actionArry.title || "Jgospel" //set page title or default to jgopsel.net
	var url = actionArry.url || "http://www.jgospel.net/" //set page title or default to jgopsel.net
	var setAsHome = actionArry.setAsHome || false;

	if (!setAsHome) { //bookmark
		if (window.sidebar) { // Mozilla Firefox Bookmark
			window.sidebar.addPanel(title, url, "");
		} else if (window.external) { // IE Favorite
			window.external.AddFavorite(url, title);
		} else if (window.opera && window.print) { // Opera Hotlist
			return true;
		}
	} else {	//set as home page
		if (document.all) {
			document.body.style.behavior = 'url(#default#homepage)';
			document.body.setHomePage(url);

		}
		else if (window.sidebar) {
			if (window.netscape) {
				try {
					netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				}
				catch (e) {
					alert("this action was aviod by your browser，if you want to enable，please enter about:config in your address line,and change the value of signed.applets.codebase_principal_support to true");
				}
			}
			var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
			prefs.setCharPref('browser.startup.homepage', url);
		}
	}
};

function openDisplay(divs)
{
    for ( d = 0; d < arguments.length; d ++ )
    {
        el = document.getElementById(arguments[d]);
        if ( !el )
            return;
        el.style.display = '';
    }
}

function closeDisplay(divs)
{
    for ( d = 0; d < arguments.length; d ++ )
    {
        el = document.getElementById(arguments[d]);
        if ( !el )
            return;
        el.style.display = 'none';
    }
}

function toggleDisplay(divs)
{
    for ( d = 0; d < arguments.length; d ++ )
    {
        el = document.getElementById(arguments[d]);
        if ( !el )
            return;
        
        if ( el.style.display == '' )
            el.style.display = 'none';
        else
            el.style.display = '';
    }
}

// JScript File
function trim(s) 
{
	while (s.substring(0,1) == ' ') {
		s = s.substring(1,s.length);
	}
	while (s.substring(s.length-1,s.length) == ' ') {
		s = s.substring(0,s.length-1);
	}
	return s;
}

// http://www.codeproject.com/jscript/dateformat.asp

// a global month names array
var gsMonthNames = new Array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);

// a global day names array
var gsDayNames = new Array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
);

// the date format prototype
Date.prototype.format = function(f)
{
    if (!this.valueOf())
        return '&nbsp;';

    var d = this;

    return f.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,
        function($1)
        {
            switch ($1.toLowerCase())
            {
            case 'yyyy': return d.getFullYear();
            case 'mmmm': return gsMonthNames[d.getMonth()];
            case 'mmm':  return gsMonthNames[d.getMonth()].substr(0, 3);
            case 'mm':   return (d.getMonth() + 1);
            case 'dddd': return gsDayNames[d.getDay()];
            case 'ddd':  return gsDayNames[d.getDay()].substr(0, 3);
            case 'dd':   return d.getDate();
            case 'hh':   return ((h = d.getHours() % 12) ? h : 12);
            case 'nn':   return d.getMinutes();
            case 'ss':   return d.getSeconds();
            case 'a/p':  return d.getHours() < 12 ? 'a' : 'p';
            }
        }
    );
}