dojo.provide("threemobile.global_util");

//turns console debugging output on or off
var devMode = false;

/**
* Displays an error message on the console only if devMode is set to true.
*/
function devError(message) {
	if (devMode == true) {
		console.error(message); // OK
	}
}

function dumpArray(obj) {
    // TODO? support nested arrays?
	if (!(obj instanceof Object)) {
		return 'Not an object or array';
	}
	var retStr = '';
	for (var key in obj) {
		if (retStr.length > 0) {
			retStr += ', ';
		}
		retStr += key + '=';
		retStr += obj[key];
	}
	return retStr;
}

/**
 * Returns a properly pluralized phrase element, such as "1 Product" or
 * "3 Products".
 * 
 * @param value the numeric value
 * @param singular the string to be returned if value is 1
 * @param plural the string to be returned if value is not equal to 1
 * @return a properly pluralized string
 */
function properPlural(value, singular, plural) {
	return ((value == 1) ? '1 ' + singular : value + ' ' + plural);
}

function handleFormResponse(response, labelSuffix, statusElem, msgArr, fields){
	var status = response['status'];
	var statusMsg = msgArr[status];
	
	//Reset label styles
	if(fields){
		for(var field in fields){
			if(dojo.byId(getFieldLabelName(fields[field], labelSuffix)))
				dojo.byId(getFieldLabelName(fields[field], labelSuffix)).className = '';
		}
	}

	/*If one field has an error, display that specific field's error.  If > 1 field error, display generic error*/

	var count = 0;
	var errFields = getFieldErrors(response['errorFields']);
	for(var errField in errFields){
		//Special handling for multi-field entries
		var fieldLabel = getFieldLabelName(errField, labelSuffix);
		if(dojo.byId(fieldLabel))
			dojo.byId(fieldLabel).className = 'messageErrorText';
		count++;
		for(var err in errFields[errField]){
			if(count < 2)
				statusMsg =  errFields[errField][err];
			else
				statusMsg = msgArr[status];
		}
	}
	dojo.byId(statusElem).className = (status=='OK'?'messageOKText':'messageErrorText');
	dojo.html.set(dojo.byId(statusElem), statusMsg);
}

function getFieldLabelName(fieldName, suffix){
	switch(fieldName){
		case 'phone1':
		case 'phone2':
		case 'phone3':
		case 'phone4':
		case 'phone5':
			fieldName = "phone";
		break;
		case 'year':
		case 'month':
		case 'daydate':
			fieldName = "birthDate";
		break;
	}
	return fieldName +'Label' + suffix;
}

function postWallMessage(messageObj, containerObj, templateObj) {
	wallMsg = new Object();
	if (!messageObj) {
		//alert("Please enter a message for your wall");
		return;
	}
	wallMsg.message = messageObj.value;
	wallMsg.stand = currentStandId;
	
	dojo.xhrPost(
		{
			url: "/stand/postwallmessage",
			handleAs: 'json',
			content: wallMsg,
			load: function(data) {
				if (data["message"]) {
					//alert(data["message"]);
				} else {
					//alert("Your message has been posted");
					messageObj.value = "";
					getWallMessages(containerObj, templateObj);
				}
			}
		}
	);
}

function getWallMessages(container, template) {
	alert('getWallMessages');
	dojo.xhrGet(
		{
			url: "/stand/getwallmessages/stand/"+currentStandId,
			handleAs: 'json',
			load: function(data) {
				container.innerHTML = "";
				messages = data['messages'];
				for (key in messages) {				    
					msg = messages[key];
					
					if (!msg.id) {
						continue;
					}
					tpl = template.innerHTML;
					for (p in msg) {							
						value = msg[p];
						rexp = new RegExp("__"+p.toUpperCase()+"__", "g");
						
						tpl = tpl.replace(rexp, value);
					
						
					}
					container.innerHTML += tpl;
				}
			}
		}
	);
}

function getFieldErrors(field){
	var arr = new Array();
	for(var fieldName in field){
		arr[fieldName] = new Array();
		for(var err in field[fieldName]){
			var errStr = field[fieldName][err];
			arr[fieldName].push(errStr);
		}
	}
	return arr;
}

function fadeMessage(elemId){
	var anim = dojo.fadeOut({
		node:elemId, 
		duration:1000, 
		delay:5000, 
		onEnd: function(){
			dojo.html.set(this.node,'');
			dojo._setOpacity(this.node, "1");
		}});
	anim.play();
}

function showAlertDialog(title, content){
	var alert = new dijit.Dialog({ title: title, content: content });
	dojo.body().appendChild(alert.domNode);
	alert.startup();
	alert.show();
	
	/*var alert2 = new dijit.Dialog({title:"test", content:"this is the second dialog"});
	//alert.domNode.appendChild(alert2.domNode);
	//dojo.body().appendChild(alert2.domNode);
	dojo.byId('dlg2').appendChild(alert2.domNode);
	alert2.startup();
	alert2.show();*/
}

function showInformationalDialog(pageUrl, domNode){
    
	var kw = {
	        url: pageUrl,
	        handleAs: "text",
	        sync:true,
      		load: function(response, ioArgs) {
      		     		
                var infoDialog = new dijit.Dialog({ style: "display:none;", execute: "", hasSIFR: true }, dojo.byId("infoDialog"));
                infoDialog.setContent(response);
                dojo.body().appendChild(infoDialog.domNode);
                dojo.query(".dijitDialogPaneContent > #header").orphan("*");
                dojo.query(".dijitDialogPaneContent > #footer").orphan("*");
                infoDialog.show();
                                                                               				
          		return response;
			},
	        error: function(response, ioArgs) { 
          		return response; 
          	},
	        timeout: 15000
	};
	dojo.xhrGet(kw);	
}

function destroyDojoObject(input) {
	dojo.query('#' + input + ' >').forEach(function(n) {
		if(dijit.byId(n.id)) {
			dijit.byId(n.id).destroy();
		}
	});
	var cell = dojo.byId(input);
	while ( cell.firstChild){
		cell.removeChild(cell.firstChild);
	}
}

function clearStyle(node) {
	if (node) 
    	//node.style.cssText = "";
		node.className = '';
}

function clearNodeValue(node) {
    if (node) 
        node.value = "";
}

function clearFormError(formName){
	var ef = dojo.byId(formName + 'Error');
	if(ef) dojo.html.set(ef, '');
}

function clearRegisterPageErrorFields() {
	clearFormError('login');
	clearFormError('register');
	clearFormError('forgotpassword');
}

function clearRegisterPageInputFields(queryTag) {

    clearNodeValue(dojo.byId("email" + queryTag)); 
    clearNodeValue(dojo.byId("password" + queryTag)); 
    clearNodeValue(dojo.byId("confirmPassword" + queryTag));
    clearNodeValue(dojo.byId("nickname" + queryTag)); 
    clearNodeValue(dojo.byId("accesspass" + queryTag));                
}

function clearRegisterPageErrorStyle(queryTag) {

    clearRegisterPageErrorFields();
    clearStyle(dojo.byId("emailLabel" + queryTag));
    clearStyle(dojo.byId("passwordLabel" + queryTag));                                       
    clearStyle(dojo.byId("confirmPasswordLabel" + queryTag));
    clearStyle(dojo.byId("nicknameLabel" + queryTag));
    clearStyle(dojo.byId("birthDateLabel" + queryTag));
    clearStyle(dojo.byId("privacyLabel" + queryTag));
    clearStyle(dojo.byId("accesspassLabel" + queryTag));
    clearStyle(dojo.byId("memberagreementLabel" + queryTag));        
}

function addRegisterPageErrorStyle(errFieldsArr, queryTag) {

    if (errFieldsArr['daydate'] 
        || errFieldsArr['month']
        || errFieldsArr['year']) {
        errFieldsArr['birthDate'] = 'birthDate'; 
    }

    for (currField in errFieldsArr) {  
        var labelNode = dojo.byId(currField + "Label" + queryTag);
        if (labelNode) {
        	//labelNode.style.color = "#FF0000";
            dojo.attr(labelNode, "style", {color: 'red'});
        }        
    }
}

function checkFieldsPopulated(inputFieldsArr) {

    var returnVal = true;
    
    for (currInputField in inputFieldsArr) {            
        node = dojo.byId(inputFieldsArr[currInputField]);
        if (!node || (node.value).length == 0)            
            returnVal = false;        
    }

    return returnVal;
}


function doCheckRegField(field, suffix){
	var errorField;
	switch(suffix){
		case 'Join':
		    clearRegisterPageErrorStyle("Login");
		    clearRegisterPageErrorStyle("Forgot");    
		    clearRegisterPageInputFields("Login");
		    clearRegisterPageInputFields("Forgot");
		    errorField = 'registerError';
		break;
		case 'Update':
			errorField = 'profileSaved';
		break;
	}
	
    var fieldName = field.name;
    var fieldVal = field.value;
    
    switch(fieldName){
    	case "confirmPassword":
	    	if(fieldVal != dojo.byId('password' + suffix).value){
	    		addRegisterPageErrorStyle({confirmPassword: new Array()}, "Join");
	    		dojo.html.set(dojo.byId('registerError'), 'Password and confirm password do not match');
	    	}
	    	return;
	    break;
    	case "birthDate":
	    	fieldVal = dojo.byId('mmonth').value + '-' + dojo.byId('ddaydate').value + '-' + dojo.byId('yyear').value;
    	break;
    }
    
    var kw = {
            url: "/myaccount/get-field-validity",
            handleAs: "json",
            load: function(data){   
    			var msgClass = 'messageOKText';
    			var msg = '';
    			if(data['status'] == 'OK'){
    				clearStyle(dojo.byId(fieldName + 'Label' + suffix));
    			}
				var msgArr = new Array();
				msgArr['OK'] = " ";
				msgArr['badvalues'] = "Invalid entry";
    			var fields = new Array(fieldName);
    			handleFormResponse(data, suffix, errorField, msgArr, fields)
            },
            error: function(data){
            },
            timeout: 15000,
            content: {"field": fieldName, "value":fieldVal}
        };
    
        dojo.xhrPost(kw);
}

function validateEmail(str){
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	return reg.test(str);
}

function validateUKPhone(str){
	str = str.replace(/\s/g,'');
	return dojox.validate.isNumberFormat(str, {
	    format:["+44##########",
	            	"+44(0)##########",
	            	"0044##########",
	            	"0##########"]
	});
}

function formatUKPhone(str){
	if(str.length < 1) return '';
	str = str.replace(/\s/g, '');
	return '0' + str.substr((str.length-10),10);
}

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1; 
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    } 
  }
return "";
}

/**
 * sIFR is a gracefully degrading text to flash font converter
 * see http://www.mikeindustries.com/blog/sifr/ for more info
 */
function do_sIFR(titlecolor){
	if(titlecolor === undefined){
		titlecolor = "#333333";
	}
	if(typeof sIFR == "function"){
		sIFR.replaceElement(".container h1.standtitle", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: titlecolor, sWmode: "transparent"}));
		sIFR.replaceElement(".container h1.black", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#000000", sWmode: "transparent"}));
		sIFR.replaceElement(".container h2.inactive", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#999999", sWmode: "transparent"}));
		sIFR.replaceElement(".container div.off h2.blue", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#999999", sWmode: "transparent"}));
		sIFR.replaceElement(".container h2.blue,.dijitDialogPaneContent h2.blue", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#336699", sWmode: "transparent"}));
		sIFR.replaceElement(".container h3.label,.dijitDialogPaneContent h3.label", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#333333", sWmode: "transparent"}));
		sIFR.replaceElement(".container h3.blue,.dijitDialogPaneContent h3.blue", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#336699", sWmode: "transparent"}));    
		sIFR.replaceElement(".container h3.lightblue,.dijitDialogPaneContent h3.lightblue", named({sFlashSrc: "/images/helveticaroundedbold.swf", sColor: "#6790B7", sWmode: "transparent"}));    
	    sIFR.setup();
	}
}

var collection = 1;
var maxCollection = 3;
function aeSlider(divId, direction){

    switch (direction) {
    case 'back':
    	collection--;
    	hideCollections();
    	if(collection<1){collection = maxCollection;}
    	dojo.byId('collectionGraphic'+collection).style.display = 'block';
        break;	
    case 'fore':
    	collection++;
    	hideCollections();
    	if(collection>maxCollection){collection = 1;}
    	dojo.byId('collectionGraphic'+collection).style.display = 'block';
       	break;
    }	  

}

function hideCollections(){
	dojo.byId('collectionGraphic1').style.display = 'none';
	dojo.byId('collectionGraphic2').style.display = 'none';
	dojo.byId('collectionGraphic3').style.display = 'none';
}

function aeSliderOriginal(divId, direction){
	
	oldDivNode = dojo.byId(divId + sliderPointer);
	if (oldDivNode) {	    
	    switch (direction) {
	    case 'back':
	        sliderPointer--;
	        newDivNodeName = divId + sliderPointer;
	        newDivNode = dojo.byId(newDivNodeName);
            if (newDivNode == null) {
                sliderPointer = 5;
                while (newDivNode == null) {
                    sliderPointer--;
                    newDivNodeName = divId + sliderPointer;
                    newDivNode = dojo.byId(newDivNodeName);            
	            }
	        }	        
	        break;	
	    case 'fore':
		    sliderPointer++;
	        newDivNodeName = divId + sliderPointer;
	        newDivNode = dojo.byId(newDivNodeName);
	        if (newDivNode == null) {	            
	            sliderPointer = 1;
	            newDivNode = dojo.byId(divId + sliderPointer);
	        }  

	        break;
	    }	  
	    oldDivNode.style.display = 'none';
		newDivNode.style.display = 'block';
	}	
}

//Set length of day select according to selected month
function setNumDays(){
	var numDays = 31;
	var mo = dojo.byId("mmonth").value;
	if (mo.length < 1)return;
	var daySel = dojo.byId("ddaydate");
	var curDay = parseInt(daySel.value);
	switch(mo){
		case "2":
			numDays = 28;
		break;
		case "4":
		case "6":
		case "9":
		case "11":
			numDays = 30;
		break;
	}
	daySel.options.length = 1;
	for(var i=1;i<=numDays;i++){
		var newopt = dojo.doc.createElement("option");
		daySel.options[i] = new Option(i,i);
	}
	if(curDay > numDays) curDay = numDays;
	if(curDay > 0) daySel.options[curDay].selected = true;
}

function setDate(){
	dojo.byId("mmonth").value = Number((dojo.byId('birthDate').value).substr(5,2));	
	dojo.byId("ddaydate").value = Number((dojo.byId('birthDate').value).substr(8,2));	
	dojo.byId("yyear").value = Number((dojo.byId('birthDate').value).substr(0,4));
}
function objToUrl(obj) {
	url = "/";
	for (k in obj) {
		url += k + "/"+obj[k] + "/";
		
	}
	return url;
}

function populateDataTemplate(containerNode, templateName, dataArr, numToDisplay) {
    
    var i = 0;

    var templateNode = dojo.byId(templateName);
    if (templateNode) {
        var templateContent = templateNode.innerHTML;
        var dataArrCount = dataArr.length;
        for (i = 0; i < numToDisplay && i < dataArrCount; i++) {
            containerNode.innerHTML += convertObjFieldsToStr(dataArr[i], templateContent, i + 1);
        }
    }
    
    return i;
}

function convertObjFieldsToStr(obj, str, index) {

    var resultStr = str;
    
    if (resultStr.length > 0) {
        for (p in obj) {
        
            var value = obj[p];
            var rexp = new RegExp("__"+p.toUpperCase()+"__", "g");
            resultStr = resultStr.replace(rexp, value);            
        }        
        if ((index + 0) >= 0) {
            resultStr = resultStr.replace(/__INDEX__/g, index);
        }        
    }
    
    return resultStr;
}

function limitCharacters(elem, disp){
	var mlength = elem.getAttribute? parseInt(elem.getAttribute("maxlength")) : "";
	if (elem.getAttribute && elem.value.length>mlength) {
		elem.value=elem.value.substring(0,mlength);
	}
	dojo.byId(disp).value = mlength - elem.value.length;
}

function urldecode( str ) {
    var hash_map = {}, ret = str.toString(), unicodeStr='', hexEscStr='';
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    hash_map["'"]   = '%27';
    hash_map['(']   = '%28';
    hash_map[')']   = '%29';
    hash_map['*']   = '%2A';
    hash_map['~']   = '%7E';
    hash_map['!']   = '%21';
    hash_map['%20'] = '+';
    hash_map['\u00DC'] = '%DC';
    hash_map['\u00FC'] = '%FC';
    hash_map['\u00C4'] = '%D4';
    hash_map['\u00E4'] = '%E4';
    hash_map['\u00D6'] = '%D6';
    hash_map['\u00F6'] = '%F6';
    hash_map['\u00DF'] = '%DF';
    hash_map['\u20AC'] = '%80';
    hash_map['\u0081'] = '%81';
    hash_map['\u201A'] = '%82';
    hash_map['\u0192'] = '%83';
    hash_map['\u201E'] = '%84';
    hash_map['\u2026'] = '%85';
    hash_map['\u2020'] = '%86';
    hash_map['\u2021'] = '%87';
    hash_map['\u02C6'] = '%88';
    hash_map['\u2030'] = '%89';
    hash_map['\u0160'] = '%8A';
    hash_map['\u2039'] = '%8B';
    hash_map['\u0152'] = '%8C';
    hash_map['\u008D'] = '%8D';
    hash_map['\u017D'] = '%8E';
    hash_map['\u008F'] = '%8F';
    hash_map['\u0090'] = '%90';
    hash_map['\u2018'] = '%91';
    hash_map['\u2019'] = '%92';
    hash_map['\u201C'] = '%93';
    hash_map['\u201D'] = '%94';
    hash_map['\u2022'] = '%95';
    hash_map['\u2013'] = '%96';
    hash_map['\u2014'] = '%97';
    hash_map['\u02DC'] = '%98';
    hash_map['\u2122'] = '%99';
    hash_map['\u0161'] = '%9A';
    hash_map['\u203A'] = '%9B';
    hash_map['\u0153'] = '%9C';
    hash_map['\u009D'] = '%9D';
    hash_map['\u017E'] = '%9E';
    hash_map['\u0178'] = '%9F';
 
    for (unicodeStr in hash_map) {
        hexEscStr = hash_map[unicodeStr]; // Switch order when decoding
        ret = replacer(hexEscStr, unicodeStr, ret); // Custom replace. No regexing
    }
    
    ret = decodeURIComponent(ret);
 
    return ret;
}

function showMessage(msg) {
	dojo.html.set(dojo.byId('messageDlgMsg'), msg);
	dijit.byId('messageDlg').show();
}
