/* canvas8.js - site-wide objects and functions */
var Canvas8 = {};

Canvas8._WEB_SCRIPT = '/common/webScript.jsp';
Canvas8._DUMB_PROXY = '/common/xdomain.jsp';
Canvas8._ADD_URL = '/canvas8-scrapbook/NodeAction';
Canvas8._SHARE_URL = '/canvas8-scrapbook/Manage';
Canvas8._METASEARCH_URL = '/metasearch-results.html';
Canvas8._MEDIAHUB_URL = '/mediahub-results.html';
Canvas8._PAGE_SIZES = [20,40,60];

$(document).ready(function () {
	$.history.init(C8.history.callback);
	$("#loading")
		.hide()
		.ajaxStart(function(){
			var scrX = 0; var scrY = 0;
			if (typeof(window.pageYOffset) == 'number') { //Netscape compliant
				scrY = window.pageYOffset + (window.innerHeight / 2);
				scrX = window.pageXOffset + (window.innerWidth / 2);
			} else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) { //DOM compliant
				scrY = document.body.scrollTop + (document.body.clientHeight / 2); 
				scrX = document.body.scrollLeft + (document.body.clientWidth / 2);
			} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { //IE6 standards compliant mode
				scrY = document.documentElement.scrollTop + (document.documentElement.clientHeight / 2); 
				scrX = document.documentElement.scrollLeft + (document.documentElement.clientWidth / 2);
			}
			$(this).css({"top":(scrY - 15) + "px","left":(scrX - 110) + "px"});
			$('#loadingMsg').text('Loading');
			$(this).show();
		})
		.ajaxStop(function(){ $(this).hide(); });
});

Canvas8.string = {
		
	urlEncode : function (str) {
		str = new String(str);
		str = str.replace(/&/g, '%26');
		str = str.replace(/"/g, '%22');
		str = str.replace(/ /g, '%20');
		str = str.replace(/=/g, '%3D');
		str = str.replace(/\+/g, '%2B');
		return str;
	},
	
	trim : function (str) { return str.replace(/^\s+|\s+$/g,""); },
	
	tidyQuotes : function (str) { 
		var quoteCount = str.split("\"").length - 1;
		if (quoteCount != null && quoteCount != 0 && quoteCount%2) str = str.split("\"").join('');
		return str; 
	},
	
	trunc : function (str, len) {
		var rStr = C8.string.trim(str);
		try { if (rStr.length > len) return rStr.substring(0, len) + "..."; } catch (e) { /* No-Op */ }
		return rStr;
	},
	
	capitalise : function (str) {
		return str.length > 1 ? str.charAt(0).toUpperCase() +  str.subst(1).toLowerCase() : str.charAt(0).toUpperCase();
	}
	
	
}

Canvas8.util = {
	
	dVal : function (v,d) {return typeof v=='undefined'?d:v;},
		
	urlEncode : function (str) { return C8.string.urlEncode(str); },
	
	clone : function (obj, key, val) {
		var clone = typeof obj == 'object' ? {} : obj;
		for (var p in obj) clone[p] = (typeof key != 'undefined' && typeof val != 'undefined' && key == p) ? val : obj[p];
		return clone;
	},
	
	/**
	 * Creates query string for a set of params. 
	 * Validates against the valid keys passed as an array.
	 */
	toQuery : function (params, validFields) {
		var argArr = [];
		for (var vf in validFields) {
			var key = validFields[vf];
			var value = params[key];
			if (value != undefined) {
				if (typeof value == 'function') value = value.apply();
				argArr.push(key+"="+Canvas8.util.urlEncode(value));	
			}
		}
		return argArr.join("&");
	},
	
	/* This function is used to set cookies */
	setCookie : function (name,value,expires,path,domain,secure) {
	  document.cookie = name + "=" + escape (value) +
	    ((expires) ? "; expires=" + expires.toGMTString() : "") +
	    ((path) ? "; path=" + path : "") +
	    ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "");
	},

	/* This function is used to get cookies */
	getCookie : function (name) {
	    var prefix = name + "=" 
	    var start = document.cookie.indexOf(prefix) 

	    if (start==-1) {
	        return null;
	    }
	    
	    var end = document.cookie.indexOf(";", start+prefix.length) 
	    if (end==-1) {
	        end=document.cookie.length;
	    }

	    var value=document.cookie.substring(start+prefix.length, end) 
	    return unescape(value);
	},
	
	validateRequired : function (form) {                                    
	    var bValid = true;
	    var focusField = null;
	    var i = 0;                                                                                          
	    var fields = new Array();                                                                           
	    oRequired = new required();                                                                         
	                                                                                                        
	    for (x in oRequired) {                                                                              
	        if ((form[oRequired[x][0]].type == 'text' || form[oRequired[x][0]].type == 'textarea' || form[oRequired[x][0]].type == 'select-one' || form[oRequired[x][0]].type == 'radio' || form[oRequired[x][0]].type == 'password') && form[oRequired[x][0]].value == '') {
	           if (i == 0)
	              focusField = form[oRequired[x][0]]; 
	              
	           fields[i++] = oRequired[x][1];
	            
	           bValid = false;                                                                             
	        }                                                                                               
	    }                                                                                                   
	                                                                                                       
	    if (fields.length > 0) {
	       focusField.focus();
	       alert(fields.join('\n'));                                                                      
	    }                                                                                                   
	                                                                                                       
	    return bValid;                                                                                      
	}

};

C8Util = Canvas8.util; // Abbreviation

/**
 * Content methods.
 */
Canvas8.content = {	

	/**
	 * Search any/all content. 
	 */
	search : function (params) {
		var SEARCHABLE_FIELDS = [
			'search', 'created', 'section', 'type', 'subtype', 'industry', 'location', 'demographic', 'keywords',
		    'source', 'keyword_or_source', 'author', 'editors_choice', 'featured', 'summary', 'contenttype',
		    'occupation', 'start', 'max', 'refine', 'target'
		];
		if (jQuery) {
			params = typeof params.data == 'undefined' ? params : params.data; // May be a callback from jQuery.bind
			params['target'] = C8.util.dVal(params['target'],'main');
			params['method'] = C8.util.dVal(params['method'],'get');
			params['start'] = C8.util.dVal(params['start'],0);
			params['max'] = C8.util.dVal(params['max'],12);
			var query = Canvas8.util.toQuery(params, SEARCHABLE_FIELDS);
			if (query.length > 0) {
				$('#' + params['target']).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/search', queryString: query});
			}
		}
		return false;
	},
	/**
	 * Latest content.
	 */
	latest : function (params) {
		var LATEST_FIELDS = [
		    'author', 'created', 'industry', 'subtype', 'location', 'max', 
		    'rendition', 'section', 'source', 'start', 'type', 'target' 
		];
		params = typeof params.data == 'undefined' ? params : params.data; // May be a callback from jQuery.bind
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, LATEST_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/latest', queryString: query});
		}
		return false;
	},
	/**
	 * Blogs
	 */
	blogs : function (params) {
		var BLOG_FIELDS = ['rendition', 'start', 'max', 'contentType'];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, BLOG_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/bloghunter', queryString: query});
		}
		return false;
	},
	/**
	 * TABS
	 */
	tabs : function (params) {
		var TABS_FIELDS = ['rendition', 'start', 'max', 'contentType'];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, TABS_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/tabs', queryString: query});
		}
		return false;
	},
	/**
	 * TABS keywordSearch
	 */
	keywordSearch : function (params) {
		var TABS_FIELDS = ['rendition', 'start', 'max', 'contentType', 'keywords', 'alternate'];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, TABS_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/keywordSearch', queryString: query});
		}
		return false;
	},
	/**
	 * Publications
	 */
	publications : function (params) {
		var PUBLICATIONS_FIELDS = ['rendition', 'start', 'max', 'contentType'];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, PUBLICATIONS_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/publications', queryString: query});
		}
		return false;
	},	
	/**
	 * Profiles
	 */
	profile : function (params) {
		var PROFILE_FIELDS = ['rendition', 'author', 'start', 'max', 'overridepagemax'];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			var query = Canvas8.util.toQuery(params, PROFILE_FIELDS);
			$("#" + params.target).load(Canvas8._WEB_SCRIPT, {path: '/canvas8/content/profiles', queryString: query});
		}
		return false;
	}
};

// Where all instances of Canvas8.Paginator are stored.
Canvas8.paginators = {};

Canvas8.Paginator = function (name) {
	this.name = name;
	this.page = function (params) {
		this.pageNumber = C8.util.dVal(params.pageNumber, C8.util.dVal(this.pageNumber, 1));
		if (typeof params.pageSize == 'function') this.pageSize = params.pageSize.apply();
		else this.pageSize = C8.util.dVal(params.pageSize, C8.util.dVal(this.pageSize, 8));
		this.total = C8.util.dVal(params.total, C8.util.dVal(this.total, 0));
		//this.sFunc = C8.util.dVal(this.sFunc, params.search);
		this.sFunc = C8.history.update;
		this.sParms = C8.util.dVal(this.sParms, params.searchParams);
		this.ctrlEl = C8.util.dVal(params.ctrlEl, C8.util.dVal(this.ctrlEl, 'pagination'));
		if (C8.history.init) C8.history.initParams = this.sParms; // Save the state of the initial page load. 
		// TODO: Pagination init and page need de-coupling.
		window.scroll(0,0); 
	}
	
	this.pageControls = function () {
		
		$('#'+this.ctrlEl).html('<p class="results"></p>');
		if (this.total > this.pageSize) {
			var pages = Math.ceil(this.total / this.pageSize);
			if (this.pageNumber > 1) {
				$('p.results').append('<a id="pgPrev" href="#">Previous</a> ');
				$('#pgPrev').bind('click',C8.util.clone(this.sParms, 'start', (this.pageNumber - 2) * this.pageSize),this.sFunc);
			}
			var dDlmt = true;
			for (var idx = 0; idx < pages; idx++) {
				var pNo = idx + 1;
				if (this.pageNumber == pNo) {
					$('p.results').append('<strong>' + pNo + '</strong> '); dDlmt = true;
				} else if (pNo > 2 && pNo < pages -1 && (pNo < this.pageNumber - 1 || pNo > this.pageNumber + 1)) {
					if (dDlmt) { $('p.results').append('... '); dDlmt = false; }
				} else {
					$('p.results').append('<a id="pg'+ pNo +'" href="#">' + pNo + '</a> ');
					$('#pg' + pNo).bind('click',C8.util.clone(this.sParms, 'start', idx * this.pageSize),this.sFunc);
				}
			}
			if (this.pageNumber < pages) {
				$('p.results').append('<a id="pgNext" href="#">Next</a>');
				$('#pgNext').bind('click',C8.util.clone(this.sParms, 'start', this.pageNumber * this.pageSize),this.sFunc);
			}
		}
		// Page size selector.
		$('<div class="display">Display number of Articles &nbsp;<select id="pgSize" size="1"></select></div>').appendTo('#'+this.ctrlEl);
		for (var ii in C8._PAGE_SIZES) {
			var selected = this.pageSize == C8._PAGE_SIZES[ii] ? ' selected="true"' : '';
			$('<option value="' + C8._PAGE_SIZES[ii] + '"' + selected + '>' + C8._PAGE_SIZES[ii] + '</option>').appendTo('#pgSize'); 
		}
		$('#pgSize').bind('change',C8.util.clone(this.sParms, 'max', function(){return parseInt($("#pgSize option:selected").val());}),this.sFunc);
	}
	
	// Add this instance.
	Canvas8.paginators[this.name] = this;
	
};

Canvas8.pagination = {
	init: function (params) {
		var paginator = C8.paginators[params['ctrlEl']];
		if (typeof paginator == 'undefined') paginator = new Canvas8.Paginator(C8.util.dVal(params['ctrlEl'],'pagination'));
		paginator.page(params);
		$(document).ready(function(){paginator.pageControls()});
	}
}

Canvas8.history = {
	init : true,
	initParams : {},
	callback : function (hash) {
		function fnByName(name, ctxt) {
			var args = [];
			for (var idx = 2; idx < arguments.length; idx++) args.push(arguments[idx]);
			//var args = Array.prototype.slice.call(arguments).splice(2);
			var ns = name.split(".");
			var fn = ns.pop();
			for(var i = 0; i < ns.length; i++) {
				ctxt = ctxt[ns[i]];
			}
			return ctxt[fn].apply(this, args);
		}
		if (hash.length > 0) {
			C8.history.init = false; // We've been called with a hash so jQuery history is being used.
			var fn;
			var sParams = [];
			var hParams = hash.split("&");
			for (var p in hParams) {
				if (hParams[p].indexOf("=") > -1) {
					var pArr = hParams[p].split("=");
					switch (pArr[0]) {
						case 'fn' : fn = pArr[1]; break;
						default : sParams[pArr[0]] = pArr[1];
					}
				}
			}
			fnByName(fn,window,sParams);
		} else if (!C8.history.init) { // No hash present and not in init state so we've paged back to p1.
			location.reload();
			//var fn = C8.history.initParams['fn'];
			//if (typeof fn == 'undefined') location.reload();
			//else fnByName(fn,window,C8.history.initParams);
		}
		return false;
	},
	update : function (params) {
		var hArr = [];
		params = typeof params.data == 'undefined' ? params : params.data;
		if (params['fn'] == 'C8.refine.search') params = C8.refine.criteria; // TODO: Function to supply params. 
		for (var p in params) {
			if (typeof params[p] == 'function') hArr.push(p + '=' + params[p].apply());
			else hArr.push(p + '=' + params[p]);
		}
		$.history.load(hArr.join('&'));
		return false;
	}
}

Canvas8.app = {
	open: function (url, name, attribs) {
		if(!this[name] || (this[name] && this[name].closed)){
			this[name] = window.open(url, name, attribs);
		}

		this[name].focus();
	
        return false;
	}	
}

Canvas8.create = {
	open: function (url, name, attribs) {
    	return C8.app.open(url, name, attribs);
	}	
}

Canvas8.share = {
	add : function (params) {
		params['action'] = 'addLinkWeb';
		params['user'] = C8.authToken;
		params['password'] = C8.authToken;
		params['force'] = 1;
		params['imageURL'] = params['imageURL'].replace(/ /g,'%20');
		var url = location.port == 8180 ? 'http://localhost:8090' + C8._ADD_URL : C8._ADD_URL;
		jQuery.ajax({ 
			type: 'GET', 
			url: url, 
			data: params, 
			dataType: 'xml', 
			success: function(xml) {
				if (params['share']) {
					$("Message", xml).each(function() {
						var shareIdIdx = $(this).text().indexOf("bookmarkId: ");
						if (shareIdIdx > -1) location.href = 'http://' + location.host + C8._SHARE_URL + "?shareId=" + $(this).text().substr(shareIdIdx + 12);
					});
				} else {
					$("Result", xml).each(function() {if ($(this).text() == 'SUCCESS') alert('This ' + params['mediaType'] + ' has been saved in your scrapbook.');});
				}
			}
		});
		return false;
	},
	share : function (params) {
		params['share'] = true;
		this.add(params);
		return false;
	}
}

Canvas8.meta = {
	rh : function(params) {
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			$("#" + params.target).load(
				Canvas8._METASEARCH_URL, {	
					search:params.search,
					target:params.target,
					start:params.start,
					max:params.max,
					sortKey:params.sortKey,
					doSort:params.doSort,
					source:C8.util.dVal(params.source,''),
					date:C8.util.dVal(params.created,''),
					ascending:function() {
						var sortKey = params.sortKey == 'title' ? 'report' : params.sortKey; // TODO: Not this!
						if (!C8Util.dVal(params.ascending,false)) $('.hubItem th.' + sortKey).addClass('descending');
						else $('.hubItem th.' + sortKey).removeClass('descending');
						return C8Util.dVal(params.ascending,false);
					}
			});
		}
		return false;
	},
	mh : function (params) {
		params = typeof params.data == 'undefined' ? params : params.data;
		if (jQuery && params.target != undefined) {
			$("#" + params.target).load(
				Canvas8._MEDIAHUB_URL, {	
					search:params.search,
					target:params.target,
					source:C8.util.dVal(params.source,''),
					start:params.start,
					max:C8.util.dVal(params.max,20)
			});
		}
		return false;
	}
}

// Convenience is key ;)
var C8 = Canvas8;
