/* SONY HEROES */


// extending the array object
Array.prototype.each=function(fun){
	for(var x=0;x<this.length;x++){
		if(!fun(this[x],x)) break;
	}
	return this;
}

// extending the string object
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}



//Global variable
var SONY = {

	init: function() {
		SONY.setupLanguageSelector();
		SONY.setupRemainingText();
		SONY.ratingWidget();
		SONY.inputBoxEnhancement();
		SONY.suggestiveSearch();
		SONY.autoClose.init();
		SONY.fileUploadEnhancement();
		SONY.checkBoxes();
		SONY.revealScore();
	},

	checkBoxes:function(){
		$(".isActivator")
			.click(function(){		
				check(this)
			})
			.each(function(){		
				check(this)
			})
		
		function check(obj){
			$(obj).parents("fieldset").find(".isActivator")
				.each(function(){	
					var fields=$(this.parentNode).find("input");
					fields.add($(this.parentNode).find("select"))
					var status=!$(this).attr("checked");
					
					fields.each(function(){
						if(this.type!="radio"){
							this.disabled=status;
							if (status){
								$(this).parents(".formRow").addClass("disabled")
							}else{
								$(this).parents(".formRow").removeClass("disabled")
							}
						}
					 })
				})
		}
	},
	
	fileUploadEnhancement:function(){
		//enhances the file upload input boxes
	
		$("input[type='file'].inputFile")
			.each(function(){
				var iF=$(this);
				iF.addClass="hidden";
			
			
				var div=$("<div></div>").addClass("fakeFile");
				
				$("<span></span>")
					.addClass("fileBtn")
					.appendTo(div)
								
				div.insertBefore(iF);
					
				var newSpan=$("<span></span>")
					.addClass("inputContainer")
					.prependTo(div)
			
				$("<span></span>")
					.addClass("label")
					.text(this.alt)
					.appendTo(newSpan);

				iF.appendTo(newSpan);
			
				var newInput=$("<input>").appendTo(div);
				newInput
					.attr("readonly",true)
					.addClass("frontInput")
					.get(0).tabIndex=-1;

			})
			.change(function(){
				$(this).parents(".fakeFile").find(".frontInput").attr("value",this.value);
			})
			.focus(function(){
				$(this.parentNode).addClass("focus");
			})
			.blur(function(){
				$(this.parentNode).removeClass("focus");
			});


	},
	
	autoClose:{		
		//this object handles the "click outside and close" behaviour for panels like the country selector.
		init:function(){
			$(document)
				.click(function(e){
					var target=e.target;
					SONY.autoClose.children
						.each(function(obj){							
							var tmpEl=target
							if(!SONY.utilities.isContained(target,obj.el)) obj.fun(obj.el);
							return true;
						})
				})
		},
		//method used to add elements
		add:function(element,fun){
			
			SONY.autoClose.children.push({el:element,fun:fun});	
		},
		
		//this array contains the elements to monitor
		children:new Array()
		
	},
	
	// Converts select/option list into a ul/li list
	setupLanguageSelector: function() {
			
		var submitBtn=$("div.PE_convertLanguageSelector input");
		var languageSelectorDiv=$("div.PE_convertLanguageSelector");
		
		// Transform each <option> to <li> with class and link to language page
		languageSelectorDiv.find('select option').each(function(){
			var language = $(this).attr('lang');
			$(this).replaceWith('<li class="'+ language +'"><a href="' + $(this).val() + '" hreflang="' + language + '">' + $(this).text() + '</a></li>');
		});
		
		// Relace <select> with <ul>
		languageSelectorDiv.find('select').replaceWith('<div id="languageSelectorList"><ul>' + $('div#languageSelector select').html() + '</ul></div>');
		
		// Replace <input> with <p>
		submitBtn.after('<p id="languageSelectButton"><a href="#">' + submitBtn.val() + '</a></p>');
		submitBtn.remove();
		
		// Functionality for <p>		
		$('p#languageSelectButton a')
			.click(function(){
				var panel=$('div#languageSelectorList');
				if(panel.hasClass("on")){
					panel.removeClass("on");	
				}else{
					panel.addClass("on");					
				}
				return false;				
			});
		
		//autoClose
		SONY.autoClose
			.add(	$('#languageSelectorList').get(0),
					function(obj){$(obj).removeClass("on")}
			);
	},
	
	
	// Restricts users from entering more than a certain number of characters
	setupRemainingText: function() {
		$('.PE_restrictCharacters').each(function(i){						
			var tArea=$(this).find("textarea");
			var chLeft=$(this).find(".charactersLeft");
			
			var msgArray=chLeft.text().split(" ");			
			msgArray.each(function(item){
								// look for a number inside the string
								if(!isNaN(parseInt(item))){
									maxCharacters=parseInt(item);
									return false;
								}
								return true;
							})
			
			var remainingCopy=chLeft.attr("title")		// the xxx word is the placeholder for the counter
			
			tArea.keyup(function(){
				var textareaCount = $(this).val().length;
				if (maxCharacters + 1 - textareaCount > 0) {
					chLeft.text(remainingCopy.replace("xxx",(maxCharacters - textareaCount)));
				} else {
					$(this).val($(this).val().slice(0,maxCharacters));
				}
			})
		});
	},
	
	ratingWidget:function(){
				
		$(".PE_ratingWidget").each(function(){
			var containerObj=this;
			
			var selectObj=$(this).find("select").get(0);
			selectObj.style.display="none";
			var starsArr=new Array();
			var starsCont=$("<div></div>").addClass("starsCont").insertBefore(selectObj);
												
			for(var x=0;x<selectObj.length;x++){
				if(selectObj.options[x].value!=="0"){
					var textValue=selectObj.options[x].firstChild.nodeValue;
					
					var star=$("<a></a>").addClass("star").appendTo(starsCont);
					
					star.get(0).relObj=selectObj.options[x];
					starsArr.push(star.get(0));
					
					var starTxt=$("<span></span>").appendTo(star);				
					//starTxt.appendChild(document.createTextNode("X"));
					
					star.attr("href","#" + selectObj.options[x].value);
					//star.title=textValue;
					star.attr("alt",textValue);
					
					//custom tooltip
					var toolTipC=$("<div></div>").addClass("toolTipContainer").appendTo(star);
					var toolTip=$("<div></div>").addClass("toolTip").appendTo(toolTipC);										
					toolTip.text("x");						
					
					toolTip.onmousemove=function(){
						this.firstChild.nodeValue="";
						this.parentNode.style.display="none";
					}
											
					
					toolTip.css("opacity",0.85);
					
					star.click(function(){
						this.relObj.selected=true;	
						//refresh(starsArr,this.relObj);
						return false;	
					})
					
					star.mouseover(function(){
						var toolTip=this.getElementsByTagName("div")[0];
						toolTip.firstChild.firstChild.nodeValue=$(this).attr("alt");
						toolTip.style.display="block";
						refresh(starsArr,this.relObj,true);
					})
					
					star.mouseout(function(){
						var toolTip=this.getElementsByTagName("div")[0];
						toolTip.firstChild.firstChild.nodeValue="";
						toolTip.style.display="none";
						var selected=selectObj.options[selectObj.selectedIndex];
						refresh(starsArr,selected,false);
					})
					
					star.focus(function(){
						var toolTip=this.getElementsByTagName("div")[0];
						toolTip.firstChild.firstChild.nodeValue=$(this).attr("alt");
						toolTip.style.display="block";					
						refresh(starsArr,this.relObj,true);
					})
						
					star.blur(function(){
						var toolTip=this.getElementsByTagName("div")[0];
						toolTip.firstChild.firstChild.nodeValue="";
						toolTip.style.display="none";					
						var selected=selectObj.options[selectObj.selectedIndex];
						refresh(starsArr,selected,false);
					})		
						
				}
			}																		

			
			var selected=selectObj.options[selectObj.selectedIndex];
			refresh(starsArr,selected,false);
			
			function refresh(starsArr,selected,selecting){
				var isOn=true;		
				if(selected.disabled) isOn=false;
				var mode=selecting?"selecting":"selected";
				
				for(var x=0;x<starsArr.length;x++){
					starsArr[x].className=(isOn)?"star " + mode :"star";
					if (starsArr[x].relObj==selected){
						//starsArr[x].className="star selected top";
						isOn=false;
					}
				}
				
			}			
		})
	},
	
	inputBoxEnhancement:function(){
		//giving some smartness to input boxes
		$("input[type='text']").add("textarea")
			.each(function(){
				this.defaultVal=this.value;
				$(this).addClass("default");
			})
			.blur(function(){
				if(this.value==""){
					this.value=this.defaultVal;
					$(this).addClass("default");					
				}
			})
			.focus(function(){
				$(this).removeClass("default");
				if(this.value==this.defaultVal) this.value="";
			})
	},
	
	suggestiveSearch:function(){

		var ssDiv=$("<div></div>").addClass("ssContainer").appendTo(document.body);
		var iFr=$("<iframe></iframe>").appendTo(ssDiv).get(0);
		var ssBody=$("<div></div>").addClass("ssBody").appendTo(ssDiv);
		 
		iFr.frameborder="0";
		iFr.scrolling="no";
		
		
		//autoClose
		SONY.autoClose
			.add(	ssDiv.get(0),
					function(obj){$(obj).hide()}
			);		
		
		$(".PE_suggestiveSearch")
			.each(function(){
				var ss=$(this);				

				/* Hiding double click behaviour, currently unecessary
				ss.dblclick(function(e){
					 var inputBox=e.target;	
					showSuggestions(inputBox);				  
				})
				*/
				
				ss.toggle(
					function(e){
						ssDiv.hide();				  
					},
					function(e){
						ssDiv.show();	
					}
				)
				
				ss.keydown(function(e){
					var inputBox=e.target;					
					var keyCode=e.keyCode;
					
					if(keyCode==9||keyCode==27){		//TAB and ESC
						ssDiv.hide();
					}
					
					//this array contains the suggestions list
					var suggestions=ssBody.find("p")
					switch(keyCode){
						case 13:		//enter
							if(ssDiv.is(':visible')){
								setValue(inputBox,suggestions.eq(inputBox.index).text())
								return false;
							}
							return true;						
							
						break;
					
						case 40:	//key down
							if (ssDiv.css("display")!="block"){
								if(inputBox.value.length==0) return false;
								showSuggestions(inputBox)			
								return false;
							}						
							suggestions.eq(inputBox.index).removeClass("selected");
							inputBox.index++;
							if(inputBox.index>suggestions.length-1) inputBox.index=0;
							suggestions.eq(inputBox.index).addClass("selected")
							suggestions.eq(inputBox.index).focus();
							inputBox.focus();							
							return false;
						break;
					
						case 38:	//key up
							suggestions.eq(inputBox.index).removeClass("selected");
							inputBox.index--;
							if(inputBox.index<0) inputBox.index=suggestions.length-1;							
							suggestions.eq(inputBox.index).addClass("selected")
							suggestions.eq(inputBox.index).focus();
							inputBox.focus();
							return false;
					}
				})
				
				ss.keyup(function(e){
					var inputBox=e.target;					
					var keyCode=e.keyCode;
					var textToSearch=null;
					var caretIndex=null;					
					
					
					//this array contains the suggestions list
					var suggestions=ssBody.find("p");
					
					//"index" holds the current highlighted suggestion
					if(typeof inputBox.index=="undefined"){
						inputBox.index=0;
					}					
					
					switch(keyCode){
							
						case 13:	//enter
							if(ssDiv.is(':visible')){								
								setValue(inputBox,suggestions.eq(inputBox.index).text())
								return false;
							}
							
							return true;
														
						break;																	
						
					}
					
					
					// this function support multiple CSV entries					
					//we just consider the current word(removing any extra space)	
					var caretPos=getValue(inputBox)
								
					if(ss.attr("oldValue")==caretPos.word){						
						return false;
					}
					
					ss.attr("oldValue",caretPos.word)
					caretIndex=caretPos.index;
					
					var textToSearch=ss.attr("oldValue");
					
					if(textToSearch==""){
						ssDiv.hide();
						return false;
					}
										
					var url=inputBox.alt?inputBox.alt:inputBox.title
					
					// the ajax call
					$.getJSON(url,{"s":textToSearch.trim()},
								function(data){
									results=data.result;	
									ssBody.empty();
																		
									var first=null;	// this is the first item of the suggestions list
									
									if (results.length>0){
										if (ssDiv.css("display")!="block"){
											showSuggestions(inputBox)			
										}										
									}
									
									results.each(function(sugg,i){
											reg=new RegExp(textToSearch.trim(),"gi");
											var word=sugg.replace(reg,"<strong>" + textToSearch.trim() + "</strong>")
											var p=$("<p></p>").appendTo(ssBody);
											
											p.mouseover(function(){
												suggestions.eq(inputBox.index).removeClass("selected");
												inputBox.index=i;												
												$(this).addClass("selected")
											})
											.click(function(){															
												setValue(inputBox,$(this).text());
											})
										
											
											if(!first) first=p;
											
											p.get(0).tabIndex=-1;
											p.get(0).innerHTML=word;		
											
											return true;
										})
									
									//resetting the height
									ssBody.height(0);
									
									var height=ssBody.get(0).scrollHeight;
									//defining a minimum height					
									ssBody.height(height<100?height:100);
									
									suggestions=ssBody.find("p");
									inputBox.index=0;
									if(first){
										first.focus();
										first.addClass("selected");
									}else{
										ssDiv.hide();
									}
									
									inputBox.focus();
								})

					})								
			})
			
			showSuggestions=function(inputBox){
				var pos=SONY.utilities.findPosition(inputBox);
				ssDiv.css("top",pos[1]+inputBox.offsetHeight);
				ssDiv.css("left",pos[0]+1);	
				ssDiv.css("width",inputBox.offsetWidth-2);
				ssDiv.show();					
			}
			
			setValue=function(inputBox,text){
				
				var index=getValue(inputBox).index;
				
				var words=inputBox.value.split(",")
				words[index]=text;
				inputBox.value=words.join(",");
				ssDiv.hide();
				
				inputBox.focus();	
				return false;
			}
			
			//returns an object containing the word that the caret is currently in and its position inside the csv array
			getValue=function(inputBox){
				var textArray=inputBox.value.split(",");
				
				var caretPosition=SONY.utilities.getCaretStart(inputBox);
				
				var result={"word":"","index":0};	//returns an object containing the current word and its position inside the csv array
				textArray.each(function(word,i){								
								caretPosition-=word.length+(i<1?0:1);
								if(caretPosition<1){									
									result={"word":word,"index":i};
									return false;
								}
								return true;
							})
				
				return result;
				
			}
	},
	
	revealScore:function(){
		var revealScoreContainer=$("ul.PE_revealScore");

		revealScoreContainer.each(function(){
			var revealScoreContainerTitle=$(this).attr('title');
			$(this).addClass('hidden');
			$(this).parent('div.detailBox').children('div.imageDriver').children('fieldset.superVote').after('<a class="revealScore" href="#">' + revealScoreContainerTitle + '</a>');
			$('a.revealScore').click(function(){
				var revealScoreContainer=$("ul.PE_revealScore");
				revealScoreContainer.each(function(){
					if($(this).hasClass('hidden')){
						$(this).removeClass('hidden');	
					}else{
						$(this).addClass('hidden');					
					}
				});
				return false;
			});
			
		});
		
	},

	utilities:{
		
		findPosition:function( oElement ) {
			//return the [x,y] of the element from the top left corner of the document.body element
			if( typeof( oElement.offsetParent ) != 'undefined' ) {
				for( var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent ) {
				  posX += oElement.offsetLeft;
				  posY += oElement.offsetTop;
				}
				return [ posX, posY ];
			} else {
				return [ oElement.x, oElement.y ];
			}
		},
		
		isContained:function(obj, container){
			while(obj.tagName!="HTML"){
				if(obj==container) return true;
				obj=obj.parentNode;	
			}
			return false;
		},
		
		// Get the end position of the caret in the object. Note that the obj needs to be in focus first
		getCaretEnd:function(obj){
			if(typeof obj.selectionEnd != "undefined"){
				return obj.selectionEnd;
			}else if(document.selection&&document.selection.createRange){
				var M=document.selection.createRange();
				try{
					var Lp = M.duplicate();
					Lp.moveToElementText(obj);
				}catch(e){
					var Lp=obj.createTextRange();
				}
				Lp.setEndPoint("EndToEnd",M);
				var rb=Lp.text.length;
				if(rb>obj.value.length){
					return -1;
				}
				return rb;
			}
		},
		
		// Get the start position of the caret in the object
		getCaretStart:function(obj){
			if(typeof obj.selectionStart != "undefined"){
				return obj.selectionStart;
			}else if(document.selection&&document.selection.createRange){
				var M=document.selection.createRange();
				try{
					var Lp = M.duplicate();
					Lp.moveToElementText(obj);
				}catch(e){
					var Lp=obj.createTextRange();
				}
				Lp.setEndPoint("EndToStart",M);
				var rb=Lp.text.length;
				if(rb>obj.value.length){
					return -1;
				}
				return rb;
			}
		},	
		
		// sets the caret position to l in the object
		setCaret:function(obj,l){
			obj.focus();
			if (obj.setSelectionRange){
				obj.setSelectionRange(l,l);
			}else if(obj.createTextRange){
				m = obj.createTextRange();		
				m.moveStart('character',l);
				m.collapse();
				m.select();
			}
		},
		
		// sets the caret selection from s to e in the object
		setSelection:function(obj,s,e){
			obj.focus();
			if (obj.setSelectionRange){
				obj.setSelectionRange(s,e);
			}else if(obj.createTextRange){
				m = obj.createTextRange();		
				m.moveStart('character',s);
				m.moveEnd('character',e);
				m.select();
			}
		}		
		
	}
}




// Run this when the document is ready
$(document).ready(function(){
	$(document.body).addClass("hasJs");
	SONY.init();
});


