
var __addCommentUrl = "AddComment.ashx";
var __viewCommentsUrl = "UserComments.ashx";
var __commentsStatisticsUrl = "CommentsStatistics.ashx";
var __abuseCommentUrl = "AbuseComment.ashx";
var __rateUrl = "Rate.ashx";

function __GetUserComments(portal, category, itemId)
{
     __formPostData = "__Portal=" + escape(portal) 
                    + "&__Category=" + escape(category) 
                    + "&__ItemID=" + escape(itemId);
    var formUrl = __EnginesServerUrl + __viewCommentsUrl + "?" + Math.random();
    
    __DoCallback(formUrl, __formPostData, __OnGetCommentsRes, itemId, null, true);
}
//For published pages using the previouse version
function __GetUserComments(portal, category, itemId, targetId) {
    __formPostData = "__Portal=" + escape(portal) 
                    + "&__Category=" + escape(category) 
                    + "&__ItemID=" + escape(itemId);
    var formUrl = __EnginesServerUrl + __viewCommentsUrl + "?" + Math.random();
    if(targetId != null)
        __DoCallback(formUrl, __formPostData, __OnGetCommentsRes, targetId, null, true);
    else 
        __DoCallback(formUrl, __formPostData, __OnGetCommentsRes, itemId, null, true);
}

function __OnGetCommentsRes(res, context)
{
    var _context = document.getElementById("_comment"+context);
	var resArr = res.split('|');
	if(resArr.length > 0 && resArr[0] != "Error")
    	_context.innerHTML = resArr[1];
}

function __GetPublishedComments(portal, category, itemId)
{
    var formUrl = __EnginesServerUrl + portal + "/" + category + "/" + itemId + ".html";
    __DoCallback(formUrl, null, __OnGetPublishedCommentsRes, itemId, null, true);
}

function __OnGetPublishedCommentsRes(res, context)
{
    var _context = document.getElementById("_comment"+context);
    _context.innerHTML = _context.innerHTML + res;
}

function __AddItemComment(portal, category, itemId, title, comment, userName, userMail, ItemTitle, ItemUrl, approved)
{
	if(title.replace(/ /g,"")=="" || comment.replace(/ /g,"")=="" || userName.replace(/ /g,"")=="")
		return false;
	
    title = __Validate(title);
    comment = __Validate(comment);
    userName = __Validate(userName);
    __formPostData = "__Portal=" + escape(portal) 
                    + "&__Category=" + escape(category) 
                    + "&__ItemID=" + escape(itemId) 
                    + "&__Title=" + escape(title) 
                    + "&__Comment=" + escape(comment) 
                    + "&__UserName=" + escape(userName) 
                    + "&__UserMail=" + escape(userMail) 
                    + "&__ItemTitle=" + escape(ItemTitle) 
                    + "&__ItemUrl=" + escape(ItemUrl) 
                    + "&__Approved=" + escape(approved);
    var formUrl = __EnginesServerUrl + __addCommentUrl + "?" + Math.random(); 
    __DoCallback(formUrl, __formPostData, __OnGetCommentsRes, itemId, null, true);
}

function __GetMostCommented(prt, cat, cnt, dat, itm) {
	__formPostData = "__Portal=" + escape(prt) ;
	
	if(cat != null)
		__formPostData += "&__Category=" + escape(cat);
	 
    __formPostData += "&__ItemsCount=" + escape(cnt)
					+ "&__DateFrom=" + dat;
    
	var formUrl = __EnginesServerUrl + __commentsStatisticsUrl + "?" + Math.random();
    
    __DoCallback(formUrl, __formPostData, __OnGetMostCommented, itm, null, true);
}

function __OnGetMostCommented(res, context) {
	if(res.indexOf("Error") > -1)
		return;
		
	document.getElementById(context).innerHTML = res;
}

function __GetCommentsCount(p, c, o) {
	__formPostData = "__Portal=" + escape(p) 
                    + "&__Category=" + escape(c) 
					+ "&__ItemIDs=" + escape(o.toJSONString());
	
    var Url = __EnginesServerUrl + __commentsStatisticsUrl + "?" + Math.random();
	
    __DoCallback(Url, __formPostData, __OnGetCommentsCount, null, null, true);
}

function __OnGetCommentsCount(res, context) {
	if(res.indexOf("Error") > -1)
		return;
	
	var resArr = eval(res);
	for(var i=0; i<resArr.length; i++){
		document.getElementById("_comcnt" + resArr[i].ID).innerHTML = resArr[i].Count; 
	}
}

function __Validate(str){
	str = str.replace(/</g, "&lt;");
	str = str.replace(/>/g, "&gt;");
	str = str.replace(/\n/g, "<br />");
	str = str.replace(/\|/g, " ");
	return str;
}

function __Abuse(icomid)
{
    __formPostData = "__CommentID=" + escape(icomid);
                    
    if(__IsAbused("icom"+icomid)) {
        return false;
    } else {
        __SetCookie("icom"+icomid, 1, 10080);
        var formUrl = __EnginesServerUrl + __abuseCommentUrl + "?" + Math.random(); 
        __DoCallback(formUrl, __formPostData, __OnAbuseCommentRes, icomid, null, true);
        return true;
    }
}

function __OnAbuseCommentRes(res, context) { }

function __IsAbused(itemId){
	var cname = itemId;
	var val = __ReadCookie(cname);
	
	if(val != null) {
		if(val == -1) {
			__EraseCookie(cname);
			return false;
		} else if(val == 1) {
			return true;
		}
	} else {
		__SetCookie(cname, -1, 60);
		return __IsAbused(itemId);
	}
	return true;
}
///////////////////////////////////////////////////////////////////////
//For published pages using the previouse version
function __RateItem(p, c, i, r, t) {
    if(r != null) {
        __RateItem(p, c, i, null, r, null, null);
    } else {
        var o = new Array(i);
        __GetMultiRate(p, c, o);
    }
}

function __RateItem(p, c, i, r) {
    if(r != null) {
        __RateItem(p, c, i, null, r, null, null);
    }
}

function __RateItem(p, c, i, e, r, t, u) {
	__formPostData = "__Portal=" + escape(p) 
                    + "&__Category=" + escape(c) 
					+ "&__ItemIDs=" + escape(i)
					+ "&__Email=" + escape(e)
					+ "&__Rate=" + escape(r*2)
					+ "&__Title=" + escape(t)
					+ "&__Url=" + escape(u);
	
	if(__IsRated("Rate"+i)) {
		__SetReadOnly(i);
	} else {
		__SetCookie("Rate"+i, 1, 10080);
		__SetReadOnly(i);
		var Url = __EnginesServerUrl + __rateUrl + "?" + Math.random();
    	__DoCallback(Url, __formPostData, __OnRateItemRes, i, null, true);
	}
}

function __GetItemRate(p, c, i) {
    var o = new Array(i);
    __GetMultiRate(p, c, o);
}

function __GetMultiRate(p, c, o) {
	__formPostData = "__Portal=" + escape(p) 
                    + "&__Category=" + escape(c) 
					+ "&__ItemIDs=" + escape(o.toJSONString());
	
	for(var i=0; i<o.length; i++) {
		if(__IsRated("Rate"+o[i])) {
			__SetReadOnly(o[i]);
		}
	}
	
    var Url = __EnginesServerUrl + __rateUrl + "?" + Math.random();
	
    __DoCallback(Url, __formPostData, __OnRateItemRes, null, null, true);
}

function __OnRateItemRes(res, context) {
	if(res.indexOf("Error") > -1)
		return;
	
	var resArr = eval(res);
	for(var i=0; i<resArr.length; i++){
		__UpdateUI(resArr[i].Count, resArr[i].Rates, resArr[i].ID);
	}
}

function __GetRateCount(p, c, o) {
	__formPostData = "__Portal=" + escape(p) 
                    + "&__Category=" + escape(c) 
					+ "&__ItemIDs=" + escape(o.toJSONString());
	
	for(var i=0; i<o.length; i++) {
		if(__IsRated("Rate"+o[i])) {
			__SetReadOnly(o[i]);
		}
	}
	
    var Url = __EnginesServerUrl + __rateUrl + "?" + Math.random();
	
    __DoCallback(Url, __formPostData, __OnGetRateCount, null, null, true);
}

function __OnGetRateCount(res, context) {
	if(res.indexOf("Error") > -1)
		return;
	
	var resArr = eval(res);
	for(var i=0; i<resArr.length; i++){
		document.getElementById("_ratcnt" + resArr[i].ID).innerHTML = resArr[i].Rates.substr(0,3); 
	}
}

function __SetReadOnly(itemId) {
	var _rateElm = document.getElementById("_rate" + itemId);
	var _elms = _rateElm.getElementsByTagName("li");
	_elms[0].className = 'final-rating';
	while(_elms.length > 1) {
		_rateElm.removeChild(_elms[_elms.length-1]);
	}
}

function __UpdateUI(count, rating, itemId) {
	var _rateElm = document.getElementById("_rate" + itemId);
	var _countElm = document.getElementById("_count" + itemId);
	
	var elm = _rateElm.getElementsByTagName("li")[0];
	__ApplyStyle(elm, "width", (rating*10)+ "%");
	
	if(_countElm)
	    _countElm.innerHTML = count;
}

function __ApplyStyle(i, e, v) {
	i.style[e] = v;
}

function __IsRated(itemId){
	var cname = itemId;
	var val = __ReadCookie(cname);
	
	if(val != null) {
		if(val == -1) {
			__EraseCookie(cname);
			return false;
		} else if(val == 1) {
			return true;
		}
	} else {
		__SetCookie(cname, -1, 10080);
		return __IsRated(itemId);
	}
	return true;
}

function __SetCookie(cname,cvalue,mins) {
	if (mins) {
		var date = new Date();
		date.setTime(date.getTime()+(mins*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = cname+"="+cvalue+expires+"; path=/";
}

function __ReadCookie(cname) {
	var nameEQ = cname + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function __EraseCookie(cname) {
	__SetCookie(cname,"",-1);
}

///////////////////////////////////////////////////////////////////////
var __pendingCallbacks = new Array();
var __synchronousCallBackIndex = -1;

function __DoCallback(formAction, eventArgument, eventCallback, param, errorCallback, useAsync) {
    var postData = eventArgument;
   
    var xmlRequest,e;
    try { xmlRequest = new XMLHttpRequest(); }
    catch(e) {
        try { xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); }
        catch(e) {}
    }
    
	var setRequestHeaderMethodExists = true;
    try { setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader); }
    catch(e) {}
    
	var callbackObj = new Object();
    callbackObj.eventCallback = eventCallback;
    callbackObj.param = param;
    callbackObj.errorCallback = errorCallback;
    callbackObj.async = useAsync;
    var callbackIndex = __FillFirstAvailableSlot(__pendingCallbacks, callbackObj);
    if (!useAsync) {
        if (__synchronousCallBackIndex != -1) {
            __pendingCallbacks[__synchronousCallBackIndex] = null;
        }
        __synchronousCallBackIndex = callbackIndex;
    }
    if (setRequestHeaderMethodExists && postData != null) {
        xmlRequest.onreadystatechange = __CallbackComplete;
        callbackObj.xmlRequest = xmlRequest;
		xmlRequest.open("POST", formAction, true);
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.send(postData);
        return;
    } else {
        xmlRequest.onreadystatechange = __CallbackComplete;
        callbackObj.xmlRequest = xmlRequest;
        xmlRequest.open("GET", formAction, true);
        xmlRequest.send(null);
        return;
    }
}

function __CallbackComplete() {
    for (i = 0; i < __pendingCallbacks.length; i++) {
        callbackObject = __pendingCallbacks[i];
        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
            __ExecuteCallback(callbackObject);
            if (!__pendingCallbacks[i].async) {
                __synchronousCallBackIndex = -1;
            }
            __pendingCallbacks[i] = null;
        }
    }
}

function __ExecuteCallback(callbackObject) {
    var response = callbackObject.xmlRequest.responseText;
    if (callbackObject.xmlRequest.status == 200 && callbackObject.eventCallback) {
        callbackObject.eventCallback(response, callbackObject.param);
    } else if (callbackObject.errorCallback){
        callbackObject.errorCallback(response, callbackObject.param);
    }
}

function __FillFirstAvailableSlot(array, element) {
    var i;
    for (i = 0; i < array.length; i++) {
        if (!array[i]) break;
    }
    array[i] = element;
    return i;
}

//////JSON/////////////////////////////
if(!Object.prototype.toJSONString){Array.prototype.toJSONString=function(w){var a=[],i,l=this.length,v;for(i=0;i<l;i+=1){v=this[i];switch(typeof v){case'object':if(v&&typeof v.toJSONString==='function'){a.push(v.toJSONString(w));}else{a.push('null');}break;case'string':case'number':case'boolean':a.push(v.toJSONString());break;default:a.push('null');}}return'['+a.join(',')+']';};Boolean.prototype.toJSONString=function(){return String(this);};Date.prototype.toJSONString=function(){function f(n){return n<10?'0'+n:n;}return'"'+this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z"';};Number.prototype.toJSONString=function(){return isFinite(this)?String(this):'null';};Object.prototype.toJSONString=function(w){var a=[],k,i,v;if(w){for(i=0;i<w.length;i+=1){k=w[i];if(typeof k==='string'){v=this[k];switch(typeof v){case'object':if(v){if(typeof v.toJSONString==='function'){a.push(k.toJSONString()+':'+v.toJSONString(w));}}else{a.push(k.toJSONString()+':null');}break;case'string':case'number':case'boolean':a.push(k.toJSONString()+':'+v.toJSONString());}}}}else{for(k in this){if(typeof k==='string'&&Object.prototype.hasOwnProperty.apply(this,[k])){v=this[k];switch(typeof v){case'object':if(v){if(typeof v.toJSONString==='function'){a.push(k.toJSONString()+':'+v.toJSONString());}}else{a.push(k.toJSONString()+':null');}break;case'string':case'number':case'boolean':a.push(k.toJSONString()+':'+v.toJSONString());}}}}return'{'+a.join(',')+'}';};(function(s){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};s.parseJSON=function(filter){var j;function walk(k,v){var i,n;if(v&&typeof v==='object'){for(i in v){if(Object.prototype.hasOwnProperty.apply(v,[i])){n=walk(i,v[i]);if(n!==undefined){v[i]=n;}}}}return filter(k,v);}if(/^[\],:{}\s]*$/.test(this.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+this+')');return typeof filter==='function'?walk('',j):j;}throw new SyntaxError('parseJSON');};s.toJSONString=function(){if(/["\\\x00-\x1f]/.test(this)){return'"'+this.replace(/[\x00-\x1f\\"]/g,function(a){var c=m[a];if(c){return c;}c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}return'"'+this+'"';};})(String.prototype);}
